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),它会显示如上所述的正确原型.
对于它的价值,手册页不正确.它显示的原型:
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.