__FUNCTION__
(что должно быть записано __func__
в C99) не является строковым литералом;это фактически неявно определенный массив символов.Таким образом, вы не можете создать строковый литерал из него с конкатенацией букв.(По крайней мере, не в стандартном C. MSVC может обрабатывать __FUNCTION__
как строковый литерал, но он не переносим.)
Конкатенация строковых литералов выполняется сразу после предварительной обработки и может применяться только к строковым литералам., а не переменные.func_name " extra text"
будет синтаксической ошибкой.
Но, как видите, это не то, что создает расширение макроса.Конкатенируемыми литералами являются L"(): " and
L «ошибка: передана строка NULL».
Обратите внимание, что если бы __func__
был строковым литералом, вы могли бы превратить его в широкий строковый литерал с конкатенацией строк.Например:
L"" __FILE__ ": the file"
является допустимым широким строковым литералом.(Но он не будет работать в Windows. См. https://stackoverflow.com/a/21789691/1566221).
Поскольку __func__
не является строковым литералом, его невозможно расширить в препроцессоре. (Ни преобразовать его в широкую строку). Лучше всего использовать его самостоятельно при вызове printf
(или wprintf
):
printf("%s %s, funcname, message);