关于c语言中的函数重载
我正在阅读open()系统调用的手册页,我注意到手册页中有两种类型的函数:关于c语言中的函数重载,c,linux,C,Linux,我正在阅读open()系统调用的手册页,我注意到手册页中有两种类型的函数: int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 我知道在C语言中没有函数重载。open()怎么可能有两个声明? 谢谢 open实际上被声明为。如果您查看,您将看到类似的内容 extern int open (const char *pathname, int flags,
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
我知道在C语言中没有函数重载。open()怎么可能有两个声明?
谢谢
open
实际上被声明为。如果您查看
,您将看到类似的内容
extern int open (const char *pathname, int flags, ...);
因此,就语法而言,前两个参数之后的任何参数都是可选的
手册页中的声明旨在告诉您,为了使函数真正正常工作,您应该不传递任何附加参数,或者传递一个类型为mode\t
的附加参数。(手册页的其余部分解释了如何确定何时执行该操作。)
你说得很对,C中没有函数重载,事实上,open
函数并不知道你用多少个参数调用它。相反,它查看O_create
位是否在flags
参数中设置,如果设置了,它知道需要第三个参数,告诉它新创建的文件应该具有什么模式。然后,它可以使用va_arg
和friends(或以其他特定于系统的方式)获取此参数的值。当然,如果您指定了O\u create
,但实际上没有传递第三个参数,或者传递了与mode\u t
不同类型的参数,编译器不会阻止您,但是当函数执行时,可能会出问题
*在其他情况下,可能会出现第三个参数,例如,当使用O_TMPFILE
标志时,但是O_create
是最常见的?它可以作为一个宏来实现吗?