我有一个可变函数:
void some_func(
char arg1,
int arg2,
char arg3,
char arg4,
int arg5,
char arg6, ...
)
{
/* Do some stuff */
}
我可以像下面这样调用函数吗?
some_func('a', 23, 'c', 'd', 56, 'y', "yahoo"); /* yahoo is extra, but valid */
some_func('a', 23, 'c', 'd', 56, 'y'); /* Nothing extra passed, only 6 args, is this allowed??? */
我关心的是第2点。可不如果函数是可变的,在调用中有额外的参数吗?
如果函数是可变的,可以不使用额外的参数吗
是的,这就是变进函数的全部意义。必须给出显式定义的任何参数,但可以传递任意数量或类型的附加参数,包括0。
C标准第6.7.6.3p9节关于函数声明的规定:
如果列表以省略号(
, ...
)结束,则无信息关于逗号后参数的数量或类型供应。
鉴于"no information about the number…对于逗号后面提供的参数("),不排除传递0个额外参数。
可以。例如,老的int printf(const char * restrict fmt, ...)
就是这样工作的。
printf("Hello worldn");
—EDIT—
我找不到任何明确允许零可变参数的措辞。我找到的最好的参考是https://port70.net/~nsz/c/c11/n1570.html#6.7.6.3p19
的一个例子。例3声明
int (*fpfi(int (*)(long), int))(int, ...);
声明一个函数fpfi,该函数返回一个指向返回int类型的函数的指针。函数fpfi有两个形参:一个是指向返回int类型(带有一个long int类型形参)的函数的指针,另一个是int类型。fpfi返回的指针指向一个函数,该函数有一个int形参,并接受0个或多个附加实参任意类型
请注意,这些例子不是标准的。