【问题标题】:wide version of __FUNCTION__ on linuxLinux 上 __FUNCTION__ 的宽版本
【发布时间】:2011-06-14 00:31:47
【问题描述】:

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

WIDEN 的技巧对我不起作用,gcc 编译器会打印: 错误:?L_FUNCTION_?未在此范围内声明

有什么帮助吗? 谢谢

【问题讨论】:

标签: widechar


【解决方案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 复制到其中,您就无法将其转换为宽字符
    猜你喜欢
    • 2019-09-18
    • 2010-09-20
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多