(19条消息) 整理:C/C++可变参数,“## VA_ARGS”宏的介绍和使用_bat67的博客-CSDN博客
Replacing text macros - cppreference.com
Variadic arguments - cppreference.com
【Just For Fun】C - 可变参数函数、可变参数宏 VA_ARGS、额外的逗号 - 知乎 (zhihu.com)
define (wengsht.github.io)
可变参数宏_百度百科 (baidu.com)
(19条消息) C语言可变参数宏定义方法_gcc宏可变参数_kerneler_的博客-CSDN博客
Variadic Macros (Using the GNU Compiler Collection (GCC))
从C++11标准开始,支持可变参数宏定义。如下所示
#define identifier replacement-list (optional) (1)
#define identifier (parameters ) replacement-list (optional) (2)
#define identifier (parameters , ...) replacement-list (optional) (3) (since C++11)
#define identifier (...) replacement-list (optional) (4) (since C++11)
#undef identifier (5)
上述代码中,(3)和(4) 是否一样呢?写个代码,测试一下。
#include
#define debugInfo(args, ...) {printf(args, ##__VA_ARGS__);}
int main(void)
{
debugInfo("Hello, world\n" "File: %s, [func] %s, [line] %d\n", __FILE__, __func__, __LINE__);
}
使用以下命令,展开上述代码中宏定义信息
$g++ variMacro.cpp -E -C -o variMacro.i -std=c++11
宏定义“debugInfo"展开后,如下所示:
# 4 "variMacro.cpp"
int main(void)
{
{printf("Hello, world\n" "File: %s, [func] %s, [line] %d\n", "variMacro.cpp", __func__, 6);};
}
编译文件
$ g++ variMacro.cpp -o variMacro.out -std=c++11
执行,运行结果如下:
$ ./variMacro.out
Hello, world
File: variMacro.cpp, [func] main, [line] 6
#include
#define debugInfo(...) {printf(__VA_ARGS__);}
int main(void)
{
debugInfo("Hello, world\n" "File: %s, [func] %s, [line] %d\n", __FILE__, __func__, __LINE__);
}
先运行以下命令,展开宏定义参数
$ g++ variMacro.cpp -E -C -o variMacro.i -std=c++11
查看variMacro.i文件,宏定义参数展开如下:
# 4 "variMacro.cpp"
int main(void)
{
{printf("Hello, world\n" "File: %s, [func] %s, [line] %d\n", "variMacro.cpp", __func__, 6);};
}
编译文件
$ g++ variMacro.cpp -o variMacro.out -std=c++11
执行,运行结果如下:
$ ./variMacro.out
Hello, world
File: variMacro.cpp, [func] main, [line] 6
由上述测试结果可见,(3)和(4) 用法不同,效果相同。
在宏定义语法中,表示字符连接符的含义,在这里的作用是什么?
测试代码如下:输出参数只有一个
#include
#define debugInfo(args, ...) {printf(args, __VA_ARGS__);}
int main(void)
{
debugInfo("Hello, world\n");
}
使用如下命令,展开宏定义代码:
$ g++ variMacro.cpp -E -C -o variMacro.i -std=c++11
结果如下:
# 4 "variMacro.cpp"
int main(void)
{
{printf("Hello, world\n", );};
}
编译代码,出现以下错误:
$ g++ variMacro.cpp -o variMacro.out -std=c++11
variMacro.cpp: In function ‘int main()’:
variMacro.cpp:3:55: error: expected primary-expression before ‘)’ token
#define debugInfo(args, ...) {printf(args, __VA_ARGS__);}
^
variMacro.cpp:6:5: note: in expansion of macro ‘debugInfo’
debugInfo("Hello, world\n");
修改源代码, 加入“##”
#include
#define debugInfo(args, ...) {printf(args, ##__VA_ARGS__);}
int main(void)
{
debugInfo("Hello, world\n");
}
使用如下命令,展开宏定义代码:
$ g++ variMacro.cpp -E -C -o variMacro.i -std=c++11
打开variMcro.i文件,结果如下:
# 4 "variMacro.cpp"
int main(void)
{
{printf("Hello, world\n");};
}
编译, 运行结果如下:
$ g++ variMacro.cpp -o variMacro.out -std=c++11
$:~/testWorkSpace/args$ ./variMacro.out
Hello, world