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

运行结果:

相关推荐
沐晓时光17 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
Zwawa20 小时前
C语言函数指针与宏实战:从回调、表驱动菜单到X-Macro,讲透嵌入式代码解耦
c语言·单片机·嵌入式
David猪大卫1 天前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger1 天前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
fengci.1 天前
CTF2MISC中等部分
开发语言·前端·学习
xys_6781 天前
JavaEE通关手册:初识Java
java·开发语言
安妮细水长流1 天前
ad7124
c语言·单片机
ShineWinsu1 天前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu1 天前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
吴名氏.1 天前
Java转AI Agent教程(第十二周)检索与切分
java·开发语言·人工智能·ai·ai agent