Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于c语言中的函数重载_C_Linux - Fatal编程技术网

关于c语言中的函数重载

关于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,

我正在阅读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, ...);
因此,就语法而言,前两个参数之后的任何参数都是可选的

手册页中的声明旨在告诉您,为了使函数真正正常工作,您应该不传递任何附加参数,或者传递一个类型为
mode\t
的附加参数。(手册页的其余部分解释了如何确定何时执行该操作。)

你说得很对,C中没有函数重载,事实上,
open
函数并不知道你用多少个参数调用它。相反,它查看
O_create
位是否在
flags
参数中设置,如果设置了,它知道需要第三个参数,告诉它新创建的文件应该具有什么模式。然后,它可以使用
va_arg
和friends(或以其他特定于系统的方式)获取此参数的值。当然,如果您指定了
O\u create
,但实际上没有传递第三个参数,或者传递了与
mode\u t
不同类型的参数,编译器不会阻止您,但是当函数执行时,可能会出问题

*在其他情况下,可能会出现第三个参数,例如,当使用
O_TMPFILE
标志时,但是
O_create
是最常见的?它可以作为一个宏来实现吗?