在宏中将字符串附加到__FUNCTION__后面

5

如果我问一个显而易见的问题,请原谅我,但是在查看了很多帖子并尝试了一些东西后,我仍然无法确定这个简单的事情。

我有这个小程序:

#define FUNC_PREFIX __FUNCTION__ "() :"

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

我可以将__FUNCTION__替换为FUNC_PREFIX以记录函数名并在括号和冒号后面输出,从而提高日志行输出的可读性。

这段代码在Visual Studio 2008中编译没有问题。但是在g++中会出现错误:expected ‘)’ before string constant。

我尝试了一些方法,例如:

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

但是没有任何效果。

如何着手解决这个问题?


如果日志记录代码知道它传递了一个函数名称,添加括号和冒号的正确位置在日志记录代码中。 如果日志记录代码不知道它是否获取了函数名称,那么您可能需要比仅函数名称更多的信息,并且可以将其格式化以包括括号。请注意,使用“#define FUNC_PREFIX __func__,”():“” 的接受答案不能在许多地方使用而不是printf 系列函数。例如,strcpy(buffer,FUNC_PREFIX)不会编译,但是strcpy(buffer,(FUNC_PREFIX))会 - 但它不会做你想要的事情。 - Jonathan Leffler
2个回答

9

__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
你的 printf 缺少引号。如果你定义宏如下,使用标识符 __func__ 就可以打印两个字符串:
#define FUNC_PREFIX __func__,"() :"

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

感谢指出引用部分 - 在发布问题时忘记包含它了。 - sskanitk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接