当前位置: 首页 > 知识库问答 >
问题:

c++ - 在宏定义中如何添加__FUNCTION__?

林国安
2023-12-26

在宏定义中如何添加__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__改为字符串就不会报错。

共有2个答案

郭瀚海
2023-12-26

__FUNCTION__

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

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

你可以用 %s 输出它:

#define LOG(strFormat, ...) _LOG( "%s:" strFormat, __FUNCTION__,  ##__VA_ARGS__) 
钱雅逸
2023-12-26

在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函数。

 类似资料:
  • 我在我的网站上使用MathJax,我想添加一些语义支持。 目前,我的MathJax配置是接收TeX输入并输出HTML-CSS输出(不幸的是,MathML在Chrome中工作不太好)。我还有一个jQuery函数,它接受任何类并将其转储到属性中。 下面的HTML。。。 用下面的脚本。。。 将输出。。。 显然,的内容将使用一系列跨度、类和样式进行样式化。我只是不打算在这里打这些。无论如何,在呈现数学之后

  • #define 叫做 宏定义命令,它也是C语言预处理命令的一种。所谓 宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串。 我们先通过一个例子来看一下 #define 的用法: 运行结果: 120 注意第 6 行代码 , 被 代替了。 就是宏定义, 为宏名, 是宏的内容(宏所表示的字符串)。在预处理阶段,对程序中所有出现的“宏名”,预处理器都会

  • 是否有一个时间格式来指定这样的日期序列到轴在D3和v4?

  • 我想在向url发送请求时添加假用户代理。但它并没有添加假useragent,而是使用默认的useragent。

  • 本文向大家介绍在C++中自定义宏的简单方法,包括了在C++中自定义宏的简单方法的使用技巧和注意事项,需要的朋友参考一下 可以使用宏定义没有返回值的“函数”。例如:       这样的“函数”与真正意义上的函数有本质的区别,因为宏是一个编译前行为,仅仅是编译前对文本进行替换。在Python源码中,经常可以看到下面类似的宏定义:     为什么要使用do { ... } while (0)这样的语法而

  • 问题内容: 我正在使用Twitter Bootstrap添加图标,没有问题。他们有很多选择。 http://twitter.github.com/bootstrap/base- css.html#icons 但是,我找不到菜单项之一的适当图标。关于“汽车”。我想要的是我想添加我的自定义图标。我怎样才能做到这一点? 问题答案: 您可以通过在自己的类(如)中定义图标来创建自己的图标: 当然要记住使用前