将字符串追加到宏中的__FUNCTION__
Appending a string to __FUNCTION__ in a macro
如果我问一个明显的问题,请原谅我,但是在经历了一堆线程并尝试了一些东西之后,我无法确定这个简单的事情。
我有这个小程序:
#define FUNC_PREFIX __FUNCTION__ "() :"
int main()
{
printf("%sn", FUNC_PREFIX);
return 0;
}
因此,我可以将FUNC_PREFIX
而不是__FUNCTION__
传递给日志函数,它们将打印调用函数名称,后跟 paren 和冒号——只是为了提高日志行输出的可读性。
这在Visual Studio 2008中按原样编译。但是在g++
中,我在字符串常量之前收到预期的错误")"
我尝试了一些事情,例如:
#define TEMP __FUNCTION__
#define FUNC_PREFIX TEMP "() :"
但无济于事。
这样做的方法是什么?
__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++
.
您的 printf 缺少引号。使用标识符__func__
,如果将宏定义为:
#define FUNC_PREFIX __func__,"() :"
int main()
{
printf("%s %sn", FUNC_PREFIX);
return 0;
}