我正在阅读open()syscall的手册页,并且注意到手册页中有2种类型的函数:
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, ...);
因此,就语法而言,前两个参数之后的任何参数都是可选的。
手册页中的声明旨在告诉您,为了使该函数真正正常工作,您不应传递任何附加参数或一个type类型的附加参数mode_t
。(手册页的其余部分介绍了如何确定何时执行该操作。)
您说对了,C中没有函数重载,并且实际上该open
函数实际上并不知道您使用多少个参数来调用它。相反,*它查看是否O_CREAT
位在设定flags
参数,如果它是,它知道要期待第三个参数,告诉它什么模式,新创建的文件应该有。然后,可以使用va_arg
和朋友(或以其他特定于系统的方式)获取此参数的值。当然,如果您指定O_CREAT
但实际上未传递第三个参数,或传递的参数类型与相比mode_t
,则编译器不会阻止您,但是函数执行时可能会出错。
*在其他情况下,可能需要第三个参数,例如,使用O_TMPFILE
标志时,但O_CREAT
到目前为止是最常见的。