我在linux手册页中找到了重载函数

时间:2019-02-01 06:02:32

标签: c overloading

当我第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根本不支持函数重载。那么这里的魔力是什么?

2 个答案:

答案 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类型的参数,或者根本不传递任何参数。