270

考虑这两个函数定义:

void foo() { }

void foo(void) { }

这两者有什么区别吗?如果不是,为什么会有void争论?审美原因?

4

4 回答 4

345

C中:

  • void foo()意思是“一个函数foo采用未指定数量的未指定类型的参数”
  • void foo(void)意思是“一个foo不带参数的函数”

C++中:

  • void foo()意思是“一个foo不带参数的函数”
  • void foo(void)意思是“一个foo不带参数的函数”

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

于 2008-09-09T01:34:28.060 回答
42

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

此外,如果函数声明不包含参数,如

double atof();

这也被认为意味着对 atof 的论点没有任何假设;关闭所有参数检查。空参数列表的这种特殊含义旨在允许旧的 C 程序使用新的编译器进行编译。但是将它与新程序一起使用是个坏主意。如果函数接受参数,则声明它们;如果不带参数,请使用 void。

于 2008-09-09T00:55:08.467 回答
9

C++11 N3337 标准草案

没有区别。

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

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

8.3.5 更改:在 C++ 中,使用空参数列表声明的函数不接受任何参数。在 C 中,空参数列表意味着函数参数的数量和类型未知。

例子:

int f();
// means int f(void) in C ++
// int f( unknown ) in C

基本原理:这是为了避免错误的函数调用(即,使用错误数量或类型的参数调用函数)。

对原始特征的影响:改变定义明确的特征的语义。此功能在 C 中被标记为“过时”。

8.5.3 功能说:

4. parameter-declaration-clause 确定在调用函数时可以指定的参数及其处理。[...] 如果参数声明子句为空,则该函数不接受任何参数。参数列表(void)相当于空参数列表。

C99

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

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

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

于 2016-04-25T08:20:57.650 回答
3

在 C 中,您在空函数引用中使用 void,以便编译器有一个原型,并且该原型“没有参数”。在 C++ 中,您不必告诉编译器您有一个原型,因为您不能省略原型。

于 2008-09-09T00:53:03.790 回答