Linux上的__FUNCTION__的宽版本

时间:2011-01-23 13:03:35

标签: widechar

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

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

任何帮助? 感谢

3 个答案:

答案 0 :(得分:1)

7年后(尽管情况似乎相同)...

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

  

C99引入了__func__,而GCC长期以来一直提供__FUNCTION__。这两个都是包含当前函数名称的字符串(语义上有细微差别;请参阅GCC手册)。 它们都不是宏;预处理器不知道当前函数的名称

由于 __ FUNCTION __ 不是宏(预处理器不“知道”任何东西),因此在(外部)宏扩展过程中它将保持不变,并在末尾L__FUNCTION__标识符,显然是无效的。
这就是为什么 double macro 方法适用于 __ FILE __ (例如),但不适用于 __ FUNCTION __ < / em> (或 __ func __ )。

因此,您问题的简短答案是“ ”(至少在预处理器级别为)。您将需要“手动”转换 __ FUNCTION __ (例如,使用[man7]: MBSTOWCS(3)函数家族之一)。

注意:它可以在 VStudio 上运行,因为根据[MS.Docs]: Predefined Macros强调仍然是我的):

  
      
  • __ FUNCTION __ 定义为字符串文字,其中包含封闭函数的未修饰名称。 仅在函数中定义。
  •   

答案 1 :(得分:0)

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

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

#define WIDE_FUNCTION WIDECHAR(__FUNCTION__)

所有重要的部分是L##x,它在编译器看到之前将 L 字符附加到字符串常量。您也可以使用相同的技术对__FILE__执行此操作。

答案 2 :(得分:-2)

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