为什么'男人2开'说有两种开放?

时间:2010-10-17 15:35:43

标签: c linux overloading manpage

我在输入man 2 open时遇到了这个问题。它说开放有两种,一种有两个args,一种有三种!上次我检查时我们无法在C中重载功能。他们是怎么做到的?他们用C ++写的吗?

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

3 个答案:

答案 0 :(得分:19)

不,他们只使用了可变功能。

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

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

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


BTW,如果你检查mode_t的BSD(包括OS X),它会显示correct prototype as above

答案 1 :(得分:8)

对于它的价值,手册页不正确。它显示的原型:

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和其他具有传递寄存器ABI的平台上运行。)

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

答案 2 :(得分:7)

不,他们使用varargs在C中写道。

查看stdarg.h,其中有示例。

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