在宏定义中如何添加__FUNCTION__?

在宏定义中如何添加__FUNCTION__?

代码如下:

#include <cstdio>

void _LOG(const char* strFormat, ...) {
    printf("res=%s\n", strFormat);
}

#define LOG(strFormat, ...) _LOG(__FUNCTION__ ":" strFormat, ##__VA_ARGS__)  //在这里添加__FUNCTION__后编译会报错,添加其它字符串就不会报错。

int main() {
    LOG("%s", "Hello, world!");
    return 0;
}

尝试将__FUNCTION__改为字符串就不会报错。

阅读 1.1k
avatarAI BotBETA

在C++中,__FUNCTION__是一个预处理器宏,它被展开为当前函数的名称。在你的例子中,你试图在宏定义中使用它,但是你遇到了一些问题。

问题在于,宏替换是在编译之前进行的,而__FUNCTION__宏是在编译时被替换的。这意味着当宏替换发生时,__FUNCTION__还未定义,因此会导致编译错误。

如果你想在宏中使用当前函数的名称,你可以使用一个函数参数来传递这个名称。例如:

#include <cstdio>

void _LOG(const char* strFunction, const char* strFormat, ...) {
    printf("%s: %s\n", strFunction, strFormat);
}

#define LOG(strFormat, ...) _LOG(__func__, strFormat, ##__VA_ARGS__)

int main() {
    LOG("%s", "Hello, world!");
    return 0;
}

在这个例子中,我添加了一个新的函数参数strFunction来接收当前函数的名称。我使用了一个新的宏__func__来获取当前函数的名称,这个宏在C++11及以后的版本中可用。然后,我在LOG宏中使用这个新的函数参数来传递当前函数的名称。这样,无论何时调用LOG宏,它都会将当前函数的名称传递给_LOG函数。

1 个回答

__FUNCTION__

__FUNCTION__ 是一个变量,不是一个宏。现在标准里用的名字是 __func__

因为它是一个变量,所以它不能进行字符串拼接。

你可以用 %s 输出它:

#define LOG(strFormat, ...) _LOG( "%s:" strFormat, __FUNCTION__,  ##__VA_ARGS__) 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏