【问题标题】:C function with optional arguments - the best way? [duplicate]带有可选参数的 C 函数 - 最好的方法? [复制]
【发布时间】:2017-08-18 17:22:52
【问题描述】:

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

【问题讨论】:

  • 您的意思是未知数量的参数,例如 printf()
  • 在您的问题中您说“多个”,但在标题中您说“可选”。你的意思是一个接受多个参数的函数,一个可能接受也可能不接受给定参数的函数,还是什么?
  • 你在寻找一个可变参数还是可选参数,在 C 中你不能有可选参数,但你可以做一些事情,比如传入 NULL 或 -1 来表示默认......你也可以有可变参数接受 f(first, ...) 参数
  • 对不起 - 我的意思是可选参数。一个可以接受 1 到 N 个参数的函数。

标签: c function variadic-functions


【解决方案1】:

如果你想要一个带有可选参数的函数,你需要使用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指针时就知道它已经完成了。

【讨论】:

  • 我认为答案应该明确指出,您需要有一些机制让函数知道传递了多少参数。类似于显式计数的东西(如示例中所示);隐式计数(如printf() 对格式说明符所做的那样,或者如果在标志中指定了O_CREATO_TMPFILEopen() 系统调用如何使用mode 参数);或哨兵(例如,最后一项可能是 0 或 -1 以指示参数的结束)。
  • @MichaelBurr 好主意。我已经扩展了这些点。
猜你喜欢
  • 2011-11-17
  • 2010-09-14
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多