当我第2个人打开时,我得到了以下信息:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
int openat(int dirfd, const char *pathname, int flags);
int openat(int dirfd, const char *pathname, int flags, mode_t mode);
这很像函数重载。但是据说C根本不支持函数重载。那么这里的魔力是什么?
答案 0 :(得分:2)
这些函数实际上不是多个函数,只是单个variadic function,接受variadic arguments,从允许您使用或不使用其最终参数的意义上讲,这都允许“重载”。例如,在我的系统上openat
的实际声明(省略属性标签等)为:
extern int openat (int __fd, const char *__file, int __oflag, ...);
最后一个...
表示它可以通过stdarg.h
的变量参数API(va_start
/ va_arg
/ va_end
)接受其他参数。
答案 1 :(得分:2)
要查看这些功能的实际定义,请运行以下命令:
echo "#include <stdio.h>" | gcc -E - | grep -C5 "open"
这将预处理一行源代码,并告诉您幕后情况。
结果应该是这样的:
int open(const char *, int, ...);
这是一个典型的varargs函数,例如printf
,但是作为程序员,您应该只传递一个mode_t
类型的参数,或者根本不传递任何参数。