考虑以下两个函数定义:
void foo() { } void foo(void) { }
这两者之间有什么区别吗?如果不是,为什么有void参数?审美原因吗?
void
在C语言中,在空函数引用中使用void,这样编译器就有了一个原型,而这个原型“没有参数”。在c++中,你不需要告诉编译器你有一个原型,因为你不能遗漏原型。
我知道你的问题属于c++,但当涉及到C时,答案可以在K& R中找到,第72-73页:
此外,如果函数声明不包括参数,如 在< / p > double atof(); 这也意味着没有什么是可以假设的 atof的论点;所有参数检查都被关闭。这个特殊的 空参数列表的含义是为了允许旧的C 要用新编译器编译的程序。但用它不是个好主意 用新的程序。如果函数接受参数,则声明它们;如果 它不带参数,使用void.
此外,如果函数声明不包括参数,如 在< / p >
double atof();
这也意味着没有什么是可以假设的 atof的论点;所有参数检查都被关闭。这个特殊的 空参数列表的含义是为了允许旧的C 要用新编译器编译的程序。但用它不是个好主意 用新的程序。如果函数接受参数,则声明它们;如果 它不带参数,使用void.
在C:
void foo()
foo
void foo(void)
在c++:
因此,通过编写foo(void),我们在两种语言中实现了相同的解释,并使我们的头文件成为多语言的(尽管我们通常需要对头文件做更多的事情,以使它们真正跨语言;也就是说,如果我们正在编译c++,则将它们包装在extern "C"中)。
foo(void)
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语言中被标记为“过时”。
例子:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
对原始特性的影响:更改为定义良好的特性的语义。这个特性在C语言中被标记为“过时”。
8.5.3功能说:
< p > 4。参数声明子句决定在什么时候可以指定参数及其处理 函数被调用。[…如果parameter-declaration-子句为空,则函数 不需要论证。参数列表(void)等价于空参数列表
C99
正如c++ 11中提到的,int f()没有指定任何参数,并且已经过时。
int f()
它可以导致工作代码或UB。
我已经详细解释了C99标准:https://stackoverflow.com/a/36292431/895245