考虑以下两个函数定义:

void foo() { }

void foo(void) { }

这两者之间有什么区别吗?如果不是,为什么会有void参数?审美原因吗?


当前回答

c++ 11 N3337标准草案

没有区别。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

附录C“兼容性”C.1.7第8条:声明者说:

8.3.5 Change: In C ++ , a function declared with an empty parameter list takes no arguments. In C, an empty parameter list means that the number and type of the function arguments are unknown. Example: int f(); // means int f(void) in C ++ // int f( unknown ) in C Rationale: This is to avoid erroneous function calls (i.e., function calls with the wrong number or type of arguments). Effect on original feature: Change to semantics of well-defined feature. This feature was marked as “obsolescent” in C.

8.5.3 functions说:

4. 参数声明子句决定在什么时候可以指定参数及其处理 函数被调用。[…如果parameter-declaration-子句为空,则函数 不需要论证。参数列表(void)等价于空参数列表。

C99

正如c++ 11所提到的,int f()没有指定任何关于参数的内容,并且已经过时了。

它可以导致工作代码或UB。

我已经在https://stackoverflow.com/a/36292431/895245上详细解释了C99标准

其他回答

c++ 11 N3337标准草案

没有区别。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

附录C“兼容性”C.1.7第8条:声明者说:

8.3.5 Change: In C ++ , a function declared with an empty parameter list takes no arguments. In C, an empty parameter list means that the number and type of the function arguments are unknown. Example: int f(); // means int f(void) in C ++ // int f( unknown ) in C Rationale: This is to avoid erroneous function calls (i.e., function calls with the wrong number or type of arguments). Effect on original feature: Change to semantics of well-defined feature. This feature was marked as “obsolescent” in C.

8.5.3 functions说:

4. 参数声明子句决定在什么时候可以指定参数及其处理 函数被调用。[…如果parameter-declaration-子句为空,则函数 不需要论证。参数列表(void)等价于空参数列表。

C99

正如c++ 11所提到的,int f()没有指定任何关于参数的内容,并且已经过时了。

它可以导致工作代码或UB。

我已经在https://stackoverflow.com/a/36292431/895245上详细解释了C99标准

在C:

Void foo()表示“一个函数foo接受一个未指定数量的未指定类型的参数” Void foo(Void)表示“函数foo不带参数”

在c++中:

Void foo()表示“函数foo不带参数” Void foo(Void)表示“函数foo不带参数”

因此,通过编写foo(void),我们在两种语言中实现了相同的解释,并使我们的头文件成为多语言的(尽管我们通常需要对头文件做更多的事情,以使它们真正跨语言;也就是说,如果我们正在编译c++,则将它们包装在extern“C”中)。

我知道你的问题与c++有关,但当涉及到C时,答案可以在K&R, 72-73页中找到:

此外,如果函数声明不包括参数,如 在 双atof (); 这也被认为是指对 atof的论点;所有参数检查都被关闭。这个特殊的 空参数列表的含义是为了允许旧的C 要用新编译器编译的程序。但用它不是个好主意 用新的程序。如果函数接受参数,则声明它们;如果 它不带参数,使用void。

在C语言中,在空函数引用中使用void,这样编译器就有了一个原型,而这个原型“没有参数”。在c++中,你不需要告诉编译器你有一个原型,因为你不能遗漏原型。