由于Unix是用C语言编写的,因此没有函数重载的概念。但是仍然可以使用不同的参数调用Unix系统调用。
示例:
open(fd, flag);
open(fd, flag, mode);
怎么可能?
答案 0 :(得分:2)
我认为它可能使用可变长度参数。
例如。
int open(const char *path, int oflag, ...);
答案 1 :(得分:2)
它使用变量参数。
来自Red Hat Linux 5上的/usr/include/fcntl.h
:
extern int open (__const char *__file, int __oflag, ...) __nonnull ((1));
以下是一个如何运作的示例:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdarg.h>
int my_open(const char *file, int flag, ...)
{
va_list va;
if ((flag & O_CREAT) != 0) {
va_start(va, flag);
int mode = va_arg(va, int);
va_end(va);
printf("file=%s, flag=%d, mode=%o\n", file, flag, mode);
} else {
printf("file=%s, flag=%d\n", file, flag);
}
}
int main()
{
my_open("filename1", O_RDONLY);
my_open("filename2", O_WRONLY | O_CREAT, 0644);
}
输出:
file=filename1, flag=0
file=filename2, flag=65, mode=644
答案 2 :(得分:-1)
因为它是在C89标准化之前编写的,编译器没有检查参数的正确性。函数声明如下
myfunc(a, b, c, d)
char *b;
int *c;
{
}
相当于今天的
int myfunc(int a, char *b, int *c, int d)
{
}