широкая версия __FUNCTION__ на Linux - PullRequest
3 голосов
/ 23 января 2011

есть ли способ напечатать __FUNCTION__ как широкий символ в Linux?

у меня не работает трюк с WIDEN, компилятор gcc печатает: error:? L_ FUNCTION _?не было объявлено в этой области

любая помощь?Спасибо

Ответы [ 3 ]

1 голос
/ 17 июля 2018

7 + лет спустя (хотя вещи кажутся одинаковыми) ...

Поскольку вы упомянули gcc , отметьте [GNU.GCC]: стандартные предопределенные макросы ( выделение - мое):

C99 представил __func__, а GCC уже давно предоставляет __FUNCTION__. Обе эти строки содержат имя текущей функции (есть небольшие семантические различия; см. Руководство GCC). Ни один из них не является макросом; препроцессор не знает названия текущей функции .

Поскольку __ FUNCTION __ не является макросом (препроцессор ничего о нем не «знает»), он останется нетронутым во время (внешнего) расширения макроса, генерируя в конце идентификатор L__FUNCTION__, который явно недействителен.
Именно поэтому подход двойной макрос работает для __ FILE __ (например), но не для __ FUNCTION __ (или __ func __ ).

Итак, краткий ответ на ваш вопрос " NO " (по крайней мере, не на уровне препроцессора). Вам нужно будет преобразовать __ FUNCTION __ «вручную» (например, используя одну из функций [man7]: MBSTOWCS (3) ).

Примечание : работает на VStudio , поскольку согласно [MS.Docs]: предопределенные макросы ( выделение все еще мое) :

  • __ FUNCTION __ Определяется как строковый литерал, содержащий недокорированное имя включающей функции. Макрос определяется только внутри функции.
0 голосов
/ 26 августа 2014

Это можно сделать с помощью макросов, вы просто должны понять, как макросы расширяются. Чтобы получить макрокоманду с широким набором символов, вам нужно создать 2 слоя макросов, например:

#define WIDE2(x) L##x
#define WIDECHAR(x) WIDE2(x)

#define WIDE_FUNCTION WIDECHAR(__FUNCTION__)

Важнейшим элементом является L##x, который добавляет символ L к строковой константе до того, как компилятор ее увидит. Вы можете сделать это для __FILE__ также, используя ту же технику.

0 голосов
/ 23 января 2011

Это больше похоже на опечатку __FUNCTION__, чем на widen() или аналогичную, по крайней мере, если вы вставили точное сообщение об ошибке.

...