C 变量arg函数和错误

C 变量arg函数和错误,c,C,我有一个带有以下签名的变量arg函数-- int G(int a,char*b,int c,…) 调用方可以传入一个选项int d(如果他们选择的话)。如果不是,我们使用默认的d (a,b,c)和d之间没有关系。我的意思是,参数a、b或c都不能告诉我是否要传入d 在我的代码中,我正在这样做-- 如果调用者只传入a、b和c(只有三个参数),va_arg()函数是否可能返回垃圾值?是的,为不存在的参数调用va_arg是未定义的行为,因此可能会得到垃圾值、崩溃或任何结果。varargs函数必须知道其可

我有一个带有以下签名的变量arg函数--

int G(int a,char*b,int c,…)

调用方可以传入一个选项int d(如果他们选择的话)。如果不是,我们使用默认的d

(a,b,c)和d之间没有关系。我的意思是,参数a、b或c都不能告诉我是否要传入d

在我的代码中,我正在这样做--


如果调用者只传入a、b和c(只有三个参数),va_arg()函数是否可能返回垃圾值?

是的,为不存在的参数调用
va_arg
是未定义的行为,因此可能会得到垃圾值、崩溃或任何结果。varargs函数必须知道其可变参数的数量和类型。

是的,据我所知,接收函数无法知道传递了多少个参数(如果有)。
printf()
函数通过解析格式字符串来计算它传递了多少个参数,如果格式字符串中的格式说明符数量与格式字符串后面的参数数量不一致,
printf()
会很高兴地打印垃圾。可能吗?这是未定义的行为,因此垃圾是绝对允许的。事实上,在大多数现代实现中,这不仅是可能的,而且是迄今为止最有可能的结果,返回堆栈上发生的任何内容。我怀疑您需要更改函数签名以允许推断参数计数,或者最好是使用附加参数的第二个接口。如果您需要这样的接口,也可能会有一些讨厌的宏骗局来计算参数并在编译时分派。但我相信会有人出现并参考解释这一点的标准。请注意,像
printf()
这样的函数知道传递了多少个参数,因为格式字符串告诉它们传递了多少个参数。系统调用
open()
有时有三个参数;它根据第二个参数中是否设置了
O_create
来确定。与任何其他varargs函数类似,必须有一种方法来知道在给定调用中是否传递了变量参数(以及传递了多少个变量参数)。
va_list valist;    
int input_d = 0;
va_start( valist, c);
input_d = va_arg(va_list, int);