考虑这两个函数定义:
void foo() { } void foo(void) { }
这两者有什么区别吗?如果没有,为什么void
那里的论点?美学原因?
在C:
void foo()
表示"一个函数foo
采用未指定数量的未指定类型的参数"
void foo(void)
意思是"一个foo
不带参数的函数"
在C++中:
void foo()
意思是"一个foo
不带参数的函数"
void foo(void)
意思是"一个foo
不带参数的函数"
foo(void)
因此,通过编写,我们在两种语言中实现了相同的解释,并使我们的标题多语言化(尽管我们通常需要对标题做更多的事情,使它们真正成为跨语言;即,extern "C"
如果我们正在编译,请将它们包装在一起C++).
我意识到你的问题与C++有关,但是当谈到C时,答案可以在K&R,第72-73页找到:
此外,如果函数声明不包含参数,如
double atof();这也意味着没有任何关于atof论点的假设; 所有参数检查都已关闭.空参数列表的这种特殊含义旨在允许较旧的C程序使用新的编译器进行编译.但是将它与新程序一起使用是个坏主意.如果函数接受参数,则声明它们; 如果它不带参数,请使用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更改:在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