在C语言中使用"void"

11

我对为什么需要将 void 传递给 C 函数感到困惑:

int f(void) { return 0; }

对比

int f() { return 0; }

什么是正确的事情以及为什么?

3个回答

16

在C语言中,int f() 是一种旧式声明方式。它表示 f 需要一个固定但未指定数量和类型的参数。例如,给定 int f() { return 0; },编译器不会对 f(42)f("hello, world") 抱怨(尽管这样的调用行为是未定义的)。

int f(void) 明确表示 f 不带任何参数。

(C++有不同的规则;Stroustrup并不像关心与旧版C代码的向后兼容性。)


5

这是C语言的一个遗留问题。

f(void) 表示函数不接受参数,因此 f(1) 是无效的。

f() 表示参数未指定,因此在这种情况下 f(1) 是有效的。


它在编译器不会报错的意义上是“有效”的。但是,如果f定义没有指定任何参数,则f(1)的行为是未定义的。如果没有原型,完全由程序员来确保参数的数量和类型正确。 - Keith Thompson

0
在这种情况下,void只是表示“没有参数”。我不确定你的第二个案例是否会编译,但无论如何,我更喜欢第一个案例尽可能清晰明了。当然,在调用f时,只需使用空括号即可:
int x = f();

1
是的,第二种情况将会编译。这是一个没有原型的函数定义(包括函数声明)。它支持与前ANSI C的兼容性。 - Keith Thompson
@KeithThompson,我很高兴从Keith Thompson那里学到这个,而不是从Ken Thompson那里。;-) - Caleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接