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__ 的宽版本的主要内容,如果未能解决你的问题,请参考以下文章

_memccpy 的宽字符版本

mobile_适配_设备兼容

查看linux服务器上Tensorflow的版本和位置

在 Linux 上删除以前版本的文件(格式为 name_#.#.#-#.extension)

react__WEBPACK_IMPORTED_MODULE_1___default.a.createContext is not a function 错误仍然存​​在,尽管版本对齐

强制QRubberBand具有特定的宽高比