在C ++或C中,foo(void)和foo()之间有区别吗?
考虑这两个函数定义:
void foo() { } void foo(void) { }
这两者有什么区别? 如果不是的话,那么为什么会有这个void
争论 美学原因?
在C :
-
void foo()
意思是“一个函数foo
采用未指定types的参数的数量不定” -
void foo(void)
意思是“一个不带参数的函数”
在C ++中 :
-
void foo()
意思是“一个不带参数的函数” -
void foo(void)
意思是“一个不带参数的函数”
因此,通过编写foo(void)
,我们在两种语言中实现了相同的解释,并使我们的头文件成为多语言的(尽pipe我们通常需要在头文件中做更多的事情,使它们真正成为跨语言的;也就是说, extern "C"
如果我们正在编译C ++)。
我意识到你的问题与C ++有关,但是当谈到C时,可以在K&R,第72-73页find答案:
此外,如果函数声明不包含参数,如
double atof();
也就是说,对于论证的论点,没有什么可以被假定的。 所有参数检查被closures。 空参数列表的这个特殊含义是为了允许较早的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中,一个空的参数列表意味着函数参数的数量和types是未知的。
例:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
基本原理:这是为了避免错误的函数调用(即函数调用的错误数量或types的参数)。
对原始特征的影响:改变为明确定义的特征的语义。 该特征在C中被标记为“过时”
8.5.3函数说:
4.参数声明子句决定了函数调用时可以指定的参数及其处理。 […]如果参数声明子句是空的,函数不带参数。 参数列表(void)相当于空的参数列表。
C99
正如C ++ 11提到的那样, int f()
没有指定参数,并且已经过时。
它可以导致工作代码或UB。
我详细解释了C99标准: https : //stackoverflow.com/a/36292431/895245
在C中,你在一个空的函数引用中使用了一个void,这样编译器就有了一个原型,而且原型没有“参数”。 在C ++中,你不必告诉编译器你有一个原型,因为你不能遗漏原型。