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

ssk*_*itk 5 c++ macros

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

我有这个小程序:

#define FUNC_PREFIX __FUNCTION__ "() :"

int main()
{
    printf("%s\n", FUNC_PREFIX);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

这在Visual Studio 2008中按原样编译.但是g++,在字符串常量之前,我得到一个错误')'

我做了一些像做的事情:

#define TEMP __FUNCTION__ 
#define FUNC_PREFIX TEMP "() :" 
Run Code Online (Sandbox Code Playgroud)

但无济于事.

这样做的方法是什么?

Jon*_*ler 10

__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++.


P.P*_*.P. 1

你的 printf 缺少引号。使用标识符__func__,如果将宏定义为:

#define FUNC_PREFIX __func__,"() :"

int main()
{
    printf("%s %s\n", FUNC_PREFIX);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)