宏定义_可变参数

0. Ref

(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))

1.可变参数 宏定义

从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) 是否一样呢?写个代码,测试一下。

1.1 (3) demo

#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

1.2 (4) demo

#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) 用法不同,效果相同。

1.3 ##是什么作用?

在宏定义语法中,表示字符连接符的含义,在这里的作用是什么?

测试代码如下:输出参数只有一个

#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

你可能感兴趣的:(C++,c++,开发语言)