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;
}

运行结果:

相关推荐
H.莓飛7 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1148 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶9 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
小灰灰搞电子9 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放9 小时前
面向对象高级(实战案例)
开发语言·python·学习
·present·10 小时前
CSAPP(lecture 4_01)
c语言·c++
fanruitian10 小时前
python else用法
开发语言·python
FRing0310 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
云深麋鹿10 小时前
C++ | 基于红黑树实现mymap与myset
开发语言·c++
weixin_4173968311 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电