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

Ami*_*deh 16 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);
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 19

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

int open(const char * pathname, int flags, ...);
Run Code Online (Sandbox Code Playgroud)

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

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


顺便说一句,如果你检查了man 2 openBSD(包括OS X),它会显示如上所述正确原型.


R..*_*R.. 8

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

int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
Run Code Online (Sandbox Code Playgroud)

不是等同于正确的原型:

int open(const char * pathname, int flags, ...);
Run Code Online (Sandbox Code Playgroud)

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

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


Pro*_*ica 7

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

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

可变参数函数可以从省略号中读取尽可能多的参数.函数"不想要"的任何额外参数实际上都被丢弃了.