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

时间:2008-09-09 00:48:24

标签: c++ c arguments

考虑这两个函数定义:

void foo() { }

void foo(void) { }

这两者有什么区别吗?如果没有,为什么那里有void参数?美学原因?

4 个答案:

答案 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。

我在https://stackoverflow.com/a/36292431/895245

详细解释了C99标准

答案 3 :(得分:2)

在C中,在空函数引用中使用void,以便编译器具有原型,并且该原型具有“无参数”。在C ++中,您不必告诉编译器您有原型,因为您不能省略原型。