5

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

我有这个小程序:

#define FUNC_PREFIX __FUNCTION__ "() :"

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

所以我可以传递FUNC_PREFIX而不是__FUNCTION__记录函数,它们将打印调用函数名称,后跟括号和冒号——只是为了提高日志行输出的可读性。

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

我尝试了一些类似的事情:

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

但无济于事。

这样做的方法是什么?

4

2 回答 2

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__. 这些不是预处理器宏。因此,您将不得不调整您的代码以正确使用gccor g++

于 2012-10-02T20:31:18.120 回答
1

您的 printf 缺少报价。使用标识符__func__,如果将宏定义为,则可以打印两个字符串:

#define FUNC_PREFIX __func__,"() :"

int main()
{
    printf("%s %s\n", FUNC_PREFIX);
    return 0;
}
于 2012-10-02T20:35:31.123 回答