我在输入man 2 open
时遇到了这个问题。它说开放有两种,一种有两个args,一种有三种!上次我检查时我们无法在C中重载功能。他们是怎么做到的?他们用C ++写的吗?
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
答案 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)