带有可选参数的C函数 - 最好的方法?

时间:2017-08-18 17:22:53

标签: c function variadic-functions

C中是否有任何方法可以使用可选参数的函数?如果没有那么系统调用如何在参数列表可变的情况下工作?

1 个答案:

答案 0 :(得分:5)

如果你想要一个带可选参数的函数,你需要使用stdarg family of functions

例如,假设您有一个带有两个int参数和一个或多个可选int参数的函数。您可以按如下方式编写它:

void myfunc(int x, int y, ...)
{
    va_list args;
    int i;

    printf("x=%d, y=%d\n", 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]=%d\n", 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指针时已完成。