在c++或C中,foo(void)和foo()之间有区别吗?

考虑以下两个函数定义:

void foo() { }


void foo(void) { }

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

76870 次浏览

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

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

此外,如果函数声明不包括参数,如 在< / p >

double atof();

这也意味着没有什么是可以假设的 atof的论点;所有参数检查都被关闭。这个特殊的 空参数列表的含义是为了允许旧的C 要用新编译器编译的程序。但用它不是个好主意 用新的程序。如果函数接受参数,则声明它们;如果 它不带参数,使用void.

C:

  • void foo()表示“函数foo接受未指定数量的未指定类型的参数”。
  • void foo(void)表示“不带参数的函数foo

c++:

  • void foo()表示“不带参数的函数foo
  • void foo(void)表示“不带参数的函数foo

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

c++ 11 N3337标准草案

没有区别。

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

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

在c++中,用空形参表声明的函数不带实参。在C语言中,是空的 参数列表表示函数参数的数量和类型是未知的

例子:

int f();
// means int f(void) in C ++
// int f( unknown ) in C
基本原理:这是为了避免错误的函数调用(即,函数调用具有错误的数字或类型 参数). < / p >

对原始特性的影响:更改为定义良好的特性的语义。这个特性在C语言中被标记为“过时”。

8.5.3功能说:

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

C99

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

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

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