如何在C中使用可选参数创建函数?

gan*_*ars 6 c gcc gnu function

最近我在编写文件打开程序时遇到了一个问题.

让我清楚地解释一下我的问题.我在这里以open电话为例.

要创建文件:

open("file_name", O_CREAT, 0766); //passing 3 parametrs
Run Code Online (Sandbox Code Playgroud)

要打开文件:

open("file_name", O_RDWR); //only 2 arguments.
Run Code Online (Sandbox Code Playgroud)

然后我清楚地看到了这一点,它也适用main().

main(void) //worked
main(int argc, char **argv); //worked
main(int argc) //worked and it's doesn't give an error like "too few arguments". 
main() //worked 
Run Code Online (Sandbox Code Playgroud)

那么我们如何创建这些可选参数呢?编译器如何验证这些原型?如果可能,请编写示例程序.

Ker*_* SB 7

open函数声明为可变参数函数.它看起来像这样:

#include <stdarg.h>

int open(char const * filename, int flags, ...)
{
    va_list ap;
    va_start(ap, flags);

    if (flags & O_CREAT)
    {
        int mode = va_arg(ap, int);
        // ...
    }

    // ...

    va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)

除非您已表明它们确实存在,否则不会消耗其他参数.

使用相同的结构printf.

手册并不总是明确这一点,因为唯一可能的两个签名是(char const *, int)(char const *, int, int),所以没有必要揭示你的函数实际上接受变量参数.(您可以通过尝试编译类似的东西来测试它open("", 1, 2, 3, 4, 5, 6).)

  • `open`函数早于1989 ANSI C标准引入的`,...`语法.早期版本的`open`只是简单地记录了两种不同的形式,并依赖弱类型检查来允许它们(在没有原型的情况下,编译器不会使用错误数量的参数来诊断调用,并且原型不是介绍到1989年).随着ANSI C标准的引入,`open`的定义被更新为使用`,...`(并且可能在内部使用`<stdarg.h>`). (2认同)