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

运行结果:

相关推荐
java资料站2 小时前
十一、评估测试
开发语言·人工智能·python
左手の明天3 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
海上小飞龙3 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
朝朝辞暮i3 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
狗凯之家源码网4 小时前
淘客口令落地页生成器 PHP 版深度评测
开发语言·php
画绛集美术4 小时前
本地化部署LLM用于美术史问答:一间美术教室的实践记录
开发语言·php
八解毒剂4 小时前
【计组】中央处理器CPU
java·开发语言·计算机组成原理
小灰灰搞电子4 小时前
C语言 <ctype.h> 头文件详解
c语言·ctype.h
FakeOccupational5 小时前
【电路笔记 信号】DBPSK 波形查找表+脉冲成形(升余弦+根升余弦滤波)
开发语言·笔记
阿钱真强道5 小时前
17 嵌入式操作系统 | uloop 事件循环:TCP 客户端
c语言·tcp/ip·tcp·事件循环·uloop