我在 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。
当我打开 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。