【问题标题】:Why does 'man 2 open' say that there are two kinds of open?为什么'man 2 open'说有两种open?
【发布时间】:2010-10-17 15:35:43
【问题描述】:

我在输入man 2 open 时遇到了这个问题。上面说open有两种,一种带两个args,一种带三个!上次我检查我们不能在 C 中重载函数。他们是怎么做到的?他们是用 C++ 编写的吗?

int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);

【问题讨论】:

    标签: c linux overloading manpage


    【解决方案1】:

    不,他们只是使用了可变参数函数。

    int open(const char * pathname, int flags, ...);
    

    这使得最后一个参数mode 是可选的。原型只展示了函数应该如何使用,而不是实际的接口。

    当然,与真正的重载不同,编译器无法对mode 参数进行类型检查,因此用户必须格外小心以确保只传递了2 或3 个参数,并且第三个参数必须是mode_t .


    顺便说一句,如果您检查 BSD(包括 OS X)的 man 2 open,它会显示 correct prototype as above

    【讨论】:

    • 如果编译器知道 POSIX 或通过某种语言扩展知道函数的参数类型,它可以进行检查。如果 gcc/glibc 还没有这样做,看到他们很快添加它我不会感到惊讶,就像 printf 参数检查一样。
    【解决方案2】:

    不管怎样,手册页是不正确的。它展示的原型:

    int open(const char * pathname, int flags);
    int open(const char * pathname, int flags, mode_t mode);
    

    等同于正确的原型:

    int open(const char * pathname, int flags, ...);
    

    使用它提供的不正确的(例如,如果您自己制作函数原型而不是包含正确的标头)将导致您的程序具有未定义的行为。 (这不仅仅是理论上的;它可能无法在 x86_64 和其他具有 pass-by-register ABI 的平台上运行。)

    手册页试图表达的(并且做得很差)是open 的参数列表的可变参数部分可以是空的,也可以是单个mode_t 类型的参数,其中缺席或可选参数的存在取决于flags 的值。

    【讨论】:

      【解决方案3】:

      不,他们用 C 语言编写,使用可变参数。

      查看stdarg.h,那里有示例。

      可变参数函数可以从ellipsis 中读取任意数量的参数。实际上,函数“不想要”的任何额外参数都被丢弃了。

      【讨论】:

        猜你喜欢
        • 2021-06-05
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2013-04-26
        • 2019-12-23
        • 2014-07-16
        • 2022-06-22
        相关资源
        最近更新 更多