7 + лет спустя (хотя вещи кажутся одинаковыми) ...
Поскольку вы упомянули gcc , отметьте [GNU.GCC]: стандартные предопределенные макросы ( выделение - мое):
C99 представил __func__, а GCC уже давно предоставляет __FUNCTION__. Обе эти строки содержат имя текущей функции (есть небольшие семантические различия; см. Руководство GCC). Ни один из них не является макросом; препроцессор не знает названия текущей функции .
Поскольку __ FUNCTION __ не является макросом (препроцессор ничего о нем не «знает»), он останется нетронутым во время (внешнего) расширения макроса, генерируя в конце идентификатор L__FUNCTION__
, который явно недействителен.
Именно поэтому подход двойной макрос работает для __ FILE __ (например), но не для __ FUNCTION __ (или __ func __ ).
Итак, краткий ответ на ваш вопрос " NO " (по крайней мере, не на уровне препроцессора). Вам нужно будет преобразовать __ FUNCTION __ «вручную» (например, используя одну из функций [man7]: MBSTOWCS (3) ).
Примечание : работает на VStudio , поскольку согласно [MS.Docs]: предопределенные макросы ( выделение все еще мое) :
- __ FUNCTION __ Определяется как строковый литерал, содержащий недокорированное имя включающей функции. Макрос определяется только внутри функции.