C ++或C中的foo(void)和foo()之间有区别吗?


253

请考虑以下两个函数定义:

void foo() { }

void foo(void) { }

两者之间有什么区别吗?如果没有,那为什么会有void争论呢?审美原因?


对于C,Q / A在此处
Antti Haapala'5

Answers:


317

C中

  • void foo() 表示“功能 foo具有未指定类型的未指定数量的参数的 ”
  • void foo(void)表示“ foo不带参数的函数”

C ++中

  • void foo()表示“ foo不带参数的函数”
  • void foo(void)表示“ foo不带参数的函数”

foo(void)因此,通过编写,我们可以在两种语言中实现相同的解释,并使标头变为多语言(尽管我们通常需要对标头做更多的事情才能使它们真正成为跨语言;即,extern "C"如果要编译,则将它们包装在C ++)。


10
但是,如果C ++要求使用void,则它可以避免“最令人头疼的解析”问题。
阿德里安·麦卡锡

5
的确如此,但是C ++中还有许多其他糟糕的分析,因此其中任何一个都没有真正意义。
DrPizza 2010年

16
在最近的问题上,@ James Kanze发布了一个有趣的花絮。在此处重新发布以避免丢失它:C的第一个版本不允许指定函数可能采用的参数数量,因此这void foo()是声明函数的唯一语法。当引入签名时,C委员会不得不将无参数与旧语法区分开来,并引入了该void foo(void)语法。C ++出于兼容性考虑采用了它。
Matthieu M.

3
您能给我一个C C90的示例吗,以后再用void foo()代替void foo(void)会产生功能差异?即我多年来一直在使用没有空白的版本,并且还没有发现任何问题,我是否缺少某些东西?
chacham15

6
@ chacham15 void foo() { if ( rand() ) foo(5); } 编译并运行(除非您非常幸运,否则会导致未定义的行为),而void foo(void)使用相同的主体会导致编译错误。
MM

39

我意识到您的问题与C ++有关,但涉及C时,答案可以在K&R,第72-73页中找到:

此外,如果函数声明不包含参数,例如

double atof();

这也意味着对atof的参数不做任何假设;所有参数检查均已关闭。空参数列表的特殊含义是允许较旧的C程序使用新的编译器进行编译。但是在新程序中使用它是一个坏主意。如果函数接受参数,则声明它们;如果不带参数,则使用void。


但是问题是关于定义的,在这种情况下,相关的C规则是函数声明符中的空列表,该声明符是该函数定义的一部分,它指定该函数没有参数。
jinawee

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为空,则该函数不接受任何参数。参数列表(无效)等效于空参数列表。

C99

正如C ++ 11所提到的,int f()关于参数的任何规定都没有,并且已经过时了。

它可以导致工作代码或UB。

我已经在以下网址详细解释了C99标准:https//stackoverflow.com/a/36292431/895245


2

在C语言中,您可以在空函数引用中使用void,以便编译器具有原型,而该原型具有“无参数”。在C ++中,您不必告诉编译器您有原型,因为您不能遗漏原型。


1
“原型”表示参数列表声明和返回类型。我之所以这样说,是因为“原型”一开始让我感到困惑。
Zan Lynx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.