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

标签 c function variadic-functions

<分区>

在 C 语言中有没有什么方法可以拥有一个接受可选参数的函数?如果不是,那么系统调用如何在参数列表可变的情况下工作?

最佳答案

如果你想要一个带有可选参数的函数,你需要使用 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。手册页显示了以下原型(prototype):

   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 指针时已完成。

关于带有可选参数的 C 函数 - 最好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45761922/

相关文章:

c - token 之间没有数据时解析文件

c - 在 .csv 文件中搜索 C 中的名称匹配项

c - 如何在 gcc 中打印 UINT64_t?

java - 这个Java方法调用的歧义在哪里?

c - FlexeLint 在 va_list 上抛出错误

c - 用位运算符解数独的算法

您可以将非 ascii 字符传递给 argv 吗?

Python:循环中的产量与打印

c++ - 添加语句后值没有增加?

matlab - 输入几个 varargin 参数