4

由于 C 不支持方法重载,怎么可能有像 一样的方法open,它显式地提供了两种不同的签名:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

printf的意思是,使用 支持不同数量的参数vargs,但除了使用自身的参数之外没有明确的签名——否则每个可能的调用都vargs应该有一个签名。然而,正如我所推测的那样,它是用 C 语言编写的,并提供了两个明确的签名。printfopen()

我实际上并没有得到这些功能的实现方式。有人可以展示一个函数如何的小例子:

void foo() { printf("bar\n"); }
void foo(int x) { printf("bar %d\n", x); }

将在 C 中实现?

4

5 回答 5

4

该函数open使用可变数量的参数定义:

int open(const char *_path, int _oflag, ...)

这是一个来源 <fcntl.h>; 该函数使用宏open在底部声明。_PROTOTYPE

请注意,它使用的部分原因open是该函数已经采用了其他参数。为了使函数采用可变数量的参数,它必须至少采用一个“固定”参数。这就是为什么不能用你的foo()函数做这个技巧的原因。

于 2013-04-13T17:44:41.447 回答
1

您选择了一个糟糕的参考资料 ( http://linux.die.net ) 来了解此功能。一个更好的是Open Group Base Specifications。它显示了以下声明open()

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

所以换句话说,这只是可变参数。

于 2013-04-13T17:47:01.567 回答
1

怎么可能有像 open 这样的方法,它明确地提供了两个不同的签名:

等等,等等,等等……不。差远了。阅读文档怎么样?

open()是一个可变参数函数,它的签名是

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

这里没有魔法。

于 2013-04-13T17:47:40.490 回答
0

正如您在问题中提到的那样,您不能在程序中定义同名的函数超过 1 次

使用宏将允许您在 C 代码中定义函数超过 1 次,但只会编译 1 个函数

#ifdef MACRO1
void foo() { printf("bar\n"); }
#else
void foo(int x) { printf("bar %d\n", x); }
#endif

主要是

#ifdef MACRO1
    foo();
#else
    foo(5);
#endif
于 2013-04-13T17:42:39.323 回答
0

它都是基于可变参数的。在打开的情况下,它只读取某些输入和状态的第三个参数。特别是当它必须创建文件时。同样, printf 仅在扫描 % 格式标记时读取参数。你的情况并没有真正起作用,因为没有早期的论据来表明有多少论据。

于 2013-04-13T17:45:15.400 回答