130.【C语言】可变参数宏

目录

1.知识回顾

2.可变参数宏

可变参数必须放在所有有名参数的后面

VA_ARGS

##


1.知识回顾

之前在以下文章讲过宏的基本概念:

18.【C语言】初识#define定义常量和宏-CSDN博客

93.【C语言】解析预处理(1)-CSDN博客

94.【C语言】解析预处理(2)-CSDN博客

95.【C语言】解析预处理(3)-CSDN博客

96.【C语言】解析预处理(4)-CSDN博客

但如果读者有去看一些开源项目的话,会发现有使用可变参数宏的,本文来讲讲

2.可变参数宏

gcc文档有介绍Variadic Macros - The C Preprocessor,这里提几个要点

可变参数必须放在所有有名参数的后面

比如这个宏的可变参数用"..."表示,放在有名参数a、b、c的后面:

cpp 复制代码
#define foo(a, b, c, ...) xxxxxxx

VA_ARGS

cpp 复制代码
#include <stdio.h>
#define TEST_VARIABLE_ARGS(a,b,c,...) printf(__VA_ARGS__)
int main()
{
	TEST_VARIABLE_ARGS(1, 2, 3, "%c,%f,%s", 'a', 2.5, "ccc");
	return 0;
}

__VA_ARGS__相当于可变参数的占位符,比如上方代码的test_variable_args(1, 2, 3, "%c,%f,%s", 'a', 2.5, "ccc")进行宏替换后的结果就是:

cpp 复制代码
printf("%c,%f,%s", 'a', 2.5, "ccc");

运行结果:

如果可变参数可能为空,可能不为空,可以使用##来处理:

cpp 复制代码
#include <stdio.h>
// 可变参数宏:当 __VA_ARGS__ 为空时,##会删除前面的逗号
#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
int main() {
    // 情况1:有可变参数,##不起删除作用
    FOO("Hello, %s!\n", "Alice");
    // 展开为:printf("Hello, %s!\n", "Alice");

    // 情况2:可变参数为空,##删除前面的逗号
    FOO("Hello, world!\n");
    return 0;
}

预处理后的结果:

cpp 复制代码
int main() {

    printf("Hello, %s!\n", "Alice");



    printf("Hello, world!\n");



    return 0;
}

运行结果:

相关推荐
霸道流氓气质1 小时前
通义千问 VL & Audio:图像、视频、语音多模态 Java 集成深度解析
java·开发语言·音视频
jayson.h1 小时前
python-可视化提取表格-通用
开发语言·python
彧azz1 小时前
B树原理与C语言实现
c语言·数据结构·b树
零依赖极客1 小时前
《30 天手搓 ARM 架构零依赖纯 C 推理引擎》课程介绍与大纲
c语言·开发语言·arm开发·人工智能·嵌入式硬件·ai编程
qq_452396231 小时前
第三篇:《变量、类型与函数:Rust 的“基本盘”》
开发语言·后端·rust
5335ld1 小时前
app版本更新(vue3+unibest+静默更新+强制更新)
开发语言·javascript·ecmascript
LuminousCPP1 小时前
数据结构-排序(三):快速排序进阶|挖坑法、双指针交换与手动栈非递归实现
c语言·数据结构·笔记·算法·排序算法
chushiyunen2 小时前
mockito笔记
java·开发语言·笔记