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

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

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

Solutions Collecting From Web of "为什么“男人2”开放说有两种开放?"

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

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

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

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


顺便说一句,如果你检查man 2 open BSD(包括OS X)它显示正确的原型如上 。

对于什么是值得的,手册页是不正确的。 它显示的原型:

 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参数列表的variadic部分可以是空的,也可以是单个mode_t类型的参数,其中可选参数的缺席或存在取决于flags的价值。

不,他们用C写了可变参数。

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

一个可变参数可以从省略号中读取尽可能多的参数。 事实上,任何额外的参数都是“不想要的”。