Linux 上 __FUNCTION__ 的宽版本
Posted
技术标签:
【中文标题】Linux 上 __FUNCTION__ 的宽版本【英文标题】:wide version of __FUNCTION__ on linux 【发布时间】:2011-06-14 00:31:47 【问题描述】:有没有办法可以在 linux 上将__FUNCTION__
打印为宽字符?
WIDEN 的技巧对我不起作用,gcc 编译器会打印: 错误:?L_FUNCTION_?未在此范围内声明
有什么帮助吗? 谢谢
【问题讨论】:
你的意思是WIDEN宏类似于来自:***.com/questions/3291047/… @VestniK:这只适用于 VStudio。 【参考方案1】:7 年多之后(尽管事情似乎是一样的)...
既然你提到了gcc,请检查[GNU.GCC]: Standard Predefined Macros(强调是我的):
C99 引入了 __func__,而 GCC 早就提供了 __FUNCTION__。这两个都是包含当前函数名称的字符串(存在细微的语义差异;请参阅 GCC 手册)。 它们都不是宏;预处理器不知道当前函数的名称。
由于 __FUNCTION__ 不是宏(预处理器对它一无所知),它在(外部)宏扩展期间保持不变,生成L__FUNCTION__
标识符的结尾,这显然是无效的。 这就是为什么 双宏 方法适用于 __FILE__(例如),但不适用于 __FUNCTION__ em>(或 __func__)。
因此,您的问题的简短回答是“NO”(至少在预处理器级别not)。您需要“手动”转换 __FUNCTION__(例如,使用 [man7]: MBSTOWCS(3) 函数系列之一)。
注意:它适用于 VStudio,因为根据 [MS.Docs]: Predefined Macros(强调仍然是我的):
__FUNCTION__ 定义为包含封闭函数的未修饰名称的字符串文字。 宏仅在函数内定义。
【讨论】:
【参考方案2】:可以使用宏来完成,您只需要了解宏是如何扩展的。 要获得宏的宽字符版本,您需要创建 2 层宏,如下所示:
#define WIDE2(x) L##x
#define WIDECHAR(x) WIDE2(x)
#define WIDE_FUNCTION WIDECHAR(__FUNCTION__)
最重要的部分是L##x
,它在编译器看到之前将L 字符附加到字符串常量。您也可以使用相同的技术对__FILE__
执行此操作。
【讨论】:
适用于 VS 2013,但不适用于 GCC(仅对 v4.9.3 感到厌烦)。错误消息:StringMacros.h:16:18: 错误:在‘L__FUNCTION__’#define WIDE2(x) L##x 之前的预期‘)’【参考方案3】:这看起来更像是 __FUNCTION__
的拼写错误,而不是 widen()
或类似的问题,至少如果您粘贴了确切的错误消息。
【讨论】:
FUNCTION 是编译器在代码中的每个函数处实例化的变量名,该变量使用 ASCII 表示 (char*) 进行声明。因此,如果不分配一个新的宽字符并使用 wcscopy 复制到其中,您就无法将其转换为宽字符以上是关于Linux 上 __FUNCTION__ 的宽版本的主要内容,如果未能解决你的问题,请参考以下文章
在 Linux 上删除以前版本的文件(格式为 name_#.#.#-#.extension)
react__WEBPACK_IMPORTED_MODULE_1___default.a.createContext is not a function 错误仍然存在,尽管版本对齐