gpt4 book ai didi

c - 关于c中的函数重载

转载 作者:行者123 更新时间:2023-12-03 02:28:56 25 4
gpt4 key购买 nike

我正在阅读 open() 系统调用的手册页,我注意到手册页中有两种类型的函数:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

我知道 C 中没有函数重载。怎么会有 2 个 open() 声明?谢谢!

最佳答案

open实际上被声明为 variadic function 。如果你查看<fcntl.h>你会看到类似的东西

extern int open (const char *pathname, int flags, ...);

因此就语法而言,前两个之后的任何参数都是可选的。

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

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

* 可能还有其他条件需要第三个参数,例如当使用O_TMPFILE时标志,但是 O_CREAT是迄今为止最常见的。

关于c - 关于c中的函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58682762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com