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

I found overload functions in linux man page

当我打开 man 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根本不支持函数重载。那么这里有什么神奇之处呢?

这些函数并不是真正的多重函数,只是一个单一的 variadic function, accepting variadic arguments,它允许 "overload" 在某种意义上你可以调用它们有或没有他们的最终参数。比如openat在我系统上的实际声明(省略属性标签等)是:

extern int openat (int __fd, const char *__file, int __oflag, ...);

最后的 ... 意味着它可以通过 stdarg.h 的可变参数 APIs (va_start/va_arg/va_end) 接受额外的参数。

要查看这些函数的实际定义,运行此命令:

echo "#include <stdio.h>" | gcc -E - | grep -C5 "open"

这将预处理一行源代码并告诉您幕后发生的事情。

结果应该是这样的:

int open(const char *, int, ...);

这是一个典型的可变参数函数,如 printf,但作为程序员,您 应该 只传递一个 mode_t 类型的参数,或根本 none。