在宏中为__FUNCTION__附加一个字符串

时间:2012-10-02 20:24:55

标签: c++ macros

如果我问一个明显的问题,请原谅我, 但经过一堆线程并尝试了一些东西后,我无法确定这个简单的事情。

我有这个小程序:

#define FUNC_PREFIX __FUNCTION__ "() :"

int main()
{
    printf("%s\n", FUNC_PREFIX);
    return 0;
}

所以我可以将FUNC_PREFIX而不是__FUNCTION__传递给日志函数,它们将打印调用函数名后跟paren和冒号 - 这样就可以提高日志行输出的可读性。

这在Visual Studio 2008中按原样编译。 但是在g++中,我在字符串常量

之前得到了错误')'

我尝试了一些事情:

#define TEMP __FUNCTION__ 
#define FUNC_PREFIX TEMP "() :" 

但无济于事。

这样做的方法是什么?

2 个答案:

答案 0 :(得分:8)

__FUNCTION__不是标准C或标准C ++中的宏。

C ++ 2011(§8.4函数定义和§8.4.1一般)和C 1999或2011都有一个预定义的标识符__func__,它是函数的名称。它不是宏,因此您无法在预处理器中将字符串与其连接。

因此,如果要使用不支持MSVS扩展的符合标准的C或C ++编译器,则必须修改代码。


GCC手册(版本4.6.1)的第§6.47节函数名称为字符串。它记录__FUNCTION____func__的同义词。它还讨论了__PRETTY_FUNCTION__。这些不是预处理器宏。因此,您必须调整代码才能正常使用gccg++

答案 1 :(得分:1)

您的printf缺少报价。使用标识符__func__,如果将宏定义为:

,则可以打印两个字符串
#define FUNC_PREFIX __func__,"() :"

int main()
{
    printf("%s %s\n", FUNC_PREFIX);
    return 0;
}