考虑这两个函数定义:
void foo() { }
void foo(void) { }
这两者有什么区别吗?如果没有,为什么那里有void
参数?美学原因?
答案 0 :(得分:300)
在 C :
void foo()
表示“函数foo
采用未指定数量的未指定类型的参数”void foo(void)
表示“一个不带参数的函数foo
”在 C ++ :
中void foo()
表示“一个不带参数的函数foo
”void foo(void)
表示“一个不带参数的函数foo
”因此,通过编写foo(void)
,我们可以在两种语言中实现相同的解释,并使我们的标题多语言化(尽管我们通常需要对标题做更多的事情,使它们真正成为跨语言;即包装如果我们正在编译C ++,那么它们在extern "C"
中。
答案 1 :(得分:37)
我意识到你的问题与C ++有关,但是当谈到C时,答案可以在K& R中找到,第72-73页:
此外,如果函数声明不包含参数,则为 在
double atof();
这也意味着没有任何关于 的论点;所有参数检查都已关闭。这个特别的 空参数列表的含义是为了允许较旧的C 用新编译器编译的程序。但使用它是个坏主意 新计划。如果函数接受参数,则声明它们;如果 它不需要参数,使用void。
答案 2 :(得分: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确定可以指定的参数及其处理时间 该函数被调用。 [...]如果parameter-declaration-clause为空,则为函数 没有参数。参数列表(void)等同于空参数列表。
<强> C99 强>
正如C ++ 11所提到的,int f()
没有指定参数,而且已经过时了。
它可以导致工作代码或UB。
详细解释了C99标准答案 3 :(得分:2)
在C中,在空函数引用中使用void,以便编译器具有原型,并且该原型具有“无参数”。在C ++中,您不必告诉编译器您有原型,因为您不能省略原型。