Answers:
在C中:
void foo()
表示“功能 foo
具有未指定类型的未指定数量的参数的 ” void foo(void)
表示“ foo
不带参数的函数”在C ++中:
void foo()
表示“ foo
不带参数的函数” void foo(void)
表示“ foo
不带参数的函数”foo(void)
因此,通过编写,我们可以在两种语言中实现相同的解释,并使标头变为多语言(尽管我们通常需要对标头做更多的事情才能使它们真正成为跨语言;即,extern "C"
如果要编译,则将它们包装在C ++)。
void
,则它可以避免“最令人头疼的解析”问题。
void foo()
是声明函数的唯一语法。当引入签名时,C委员会不得不将无参数与旧语法区分开来,并引入了该void foo(void)
语法。C ++出于兼容性考虑采用了它。
void foo()
代替void foo(void)
会产生功能差异?即我多年来一直在使用没有空白的版本,并且还没有发现任何问题,我是否缺少某些东西?
void foo() { if ( rand() ) foo(5); }
编译并运行(除非您非常幸运,否则会导致未定义的行为),而void foo(void)
使用相同的主体会导致编译错误。
我意识到您的问题与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为空,则该函数不接受任何参数。参数列表(无效)等效于空参数列表。
C99
正如C ++ 11所提到的,int f()
关于参数的任何规定都没有,并且已经过时了。
它可以导致工作代码或UB。
我已经在以下网址详细解释了C99标准:https://stackoverflow.com/a/36292431/895245