将字符串追加到宏中的__FUNCTION__

Appending a string to __FUNCTION__ in a macro

本文关键字:FUNCTION 字符串 追加      更新时间:2023-10-16

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

我有这个小程序:

#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__ 。 这些不是预处理器宏。 因此,您必须调整代码以正确使用 gccg++ .

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

#define FUNC_PREFIX __func__,"() :"
int main()
{
    printf("%s %sn", FUNC_PREFIX);
    return 0;
}