5

有没有办法可以__FUNCTION__在 linux 上打印为宽字符?

WIDEN 的技巧对我不起作用,gcc 编译器打印:错误:?L_ FUNCTION _?在这方面没有申明

有什么帮助吗?谢谢

4

3 回答 3

2

7 年多后(虽然事情似乎是一样的)......

既然您提到了gcc,请检查[GNU.GCC]: Standard Predefined Macros重点是我的):

C99引入了__func__,GCC提供了很长时间的__FUNCTION__。这两个都是包含当前函数名称的字符串(存在细微的语义差异;请参阅 GCC 手册)。它们都不是宏;预处理器不知道当前函数的名称

由于__FUNCTION__不是宏(预处理器对它一无所知),它在(外部)宏扩展期间将保持不变,最后生成L__FUNCTION__标识符,这显然是无效的。
这就是为什么双宏方法适用于__FILE__(例如),但不适用于__FUNCTION__(或__func__)。

因此,对您的问题的简短回答是“”(至少不是在预处理器级别)。您将需要“手动”转换__FUNCTION__ (例如,使用[man7]: MBSTOWCS(3)函数系列之一)。

注意:它适用于VStudio,因为根据[MS.Docs]: Predefined Macros重点仍然是我的):

  • __FUNCTION__定义为包含封闭函数的未修饰名称的字符串文字。仅在函数内定义。
于 2018-07-17T12:36:11.560 回答
-1

它可以使用宏来完成,您只需要了解宏是如何扩展的。要获得宏的宽字符版本,您需要创建 2 层宏,如下所示:

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

#define WIDE_FUNCTION WIDECHAR(__FUNCTION__)

最重要的部分是在编译器看到它之前将LL##x字符附加到字符串常量。您也可以使用相同的技术来做到这一点。__FILE__

于 2014-08-26T18:33:21.187 回答
-2

至少如果您粘贴了确切的错误消息,这看起来更像是一个错字而__FUNCTION__不是问题或类似问题。widen()

于 2011-01-23T13:13:36.920 回答