如果我问一个明显的问题,请原谅我, 但经过一堆线程并尝试了一些东西后,我无法确定这个简单的事情。
我有这个小程序:
#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 "() :"
但无济于事。
这样做的方法是什么?
答案 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__
。这些不是预处理器宏。因此,您必须调整代码才能正常使用gcc
或g++
。
答案 1 :(得分:1)
您的printf缺少报价。使用标识符__func__
,如果将宏定义为:
#define FUNC_PREFIX __func__,"() :"
int main()
{
printf("%s %s\n", FUNC_PREFIX);
return 0;
}