c语言可变长参数传递问题

马谦马谦马谦
马谦马谦马谦
马谦马谦马谦
609
文章
12
评论
2018年9月14日23:28:29 评论

一、问题描述

C语言中的函数提供了一种可变长参数机制,这个机制使得我们在操作的时候充分自定义自己的功能,例如使用最多的printf函数:

它的函数声明为:printf(const char *fmt, ...);,其中的...就代表不固定的参数,使用起来十分方便。但是在函数嵌套的时候,不能直接使用...来传递,例如代码

编译时就会报错:

如果要嵌套使用,需要通过宏__VA_ARGS__完成:

二、参数个数为0的问题

使用上面的方法,参数个数为0的时候编译也会报错:

编译报错:

原因是因为参数个数零,预编译后main函数里面的代码变成了:

可以看到:fprintf函数的最后是"HelloWorld", );,最后一个逗号和括号之间没有数据,语法不通过。

解决方案

__VA_ARGS__前面加上##,例如:

编译运行:

历史上的今天
九月
14
马谦马谦马谦
  • 本文由 发表于 2018年9月14日23:28:29
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/c-cpp/c-function-pass-variable-param.html
给socket分配随机端口 C/C++

给socket分配随机端口

客户端的socket不需要手动执行bind绑定地址,但这不意味着客户端socket真的不需要绑定端口,实际上是内核它帮我们做了这个操作,在执行connect时,内核发现没有绑定端口,就会自动选择一个合...
vector中emplace_back方法的用途 C/C++

vector中emplace_back方法的用途

在写代码的过程中,CLion提醒我把push_back方法替换成emplace_back方法: 代码中我的想法是使用vector创建一个二维数组,并提前分配好空间,避免后序频繁扩容增加时间复杂度。 e...
宏定义踩坑实战:嵌套调用宏定义 C/C++

宏定义踩坑实战:嵌套调用宏定义

问题背景:在刷题的过程中,要使用min函数,但是线上OJ并没有这个函数。因为一时也想不起它到底属于哪个头文件,所以为了偷懒,顺手就写下了以下宏定义: #define min(x, y) (x) <...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: