C中有什么方法可以拥有一个接受可选参数的函数吗? 如果不是,那么在参数列表可变的情况下,系统调用如何工作?
如果你想要一个接受可选参数的函数,你需要使用stdarg
系列函数。
例如,假设您有一个函数,该函数接受两个int
参数和一个或多个可选的int
参数。 你可以这样写:
void myfunc(int x, int y, ...)
{
va_list args;
int i;
printf("x=%d, y=%dn", x, y);
// y indicates how many optional arguments
if (y > 0) {
// initialize reading of optional args, passing in the last explicit argument
va_start(args, y);
for (i=0; i<y; i++) {
// read an optional int arg
int z = va_arg(args, int);
printf("z[%d]=%dn", i, z);
}
// done reading optional args
va_end(args);
}
}
您需要至少有一个显式命名的参数,并且您必须有某种方法来知道有多少个可选参数。 在此示例中,参数y
指示有多少个可选参数。
我们再来看一个系统功能,open
. 手册页显示以下原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
在 C 中,不能有两个同名的函数。 如果您查看头文件,您可能会发现以下内容:
int open(const char *pathname, int flags, ...);
在这种情况下,如果flags
参数设置了O_CREAT
标志,则它知道读取单个可选参数。
然后是execl
函数:
int execl(const char *path, const char *arg, ...);
该函数将arg
作为要运行的程序的第一个参数,然后读取可选参数,每个参数都是一个char *
,以读取后续参数。 调用方应将NULL
作为最后一个参数传递,以指示参数列表的结束。 因此,当此函数读取可选参数时,它知道它在读取指针时已完成NULL
。