`f(void)`表示C ++ 11或C中没有参数?
在C ++ 11中,以下函数声明:
int f(void);
意思是:
int f();
由非依赖类型void的单个未命名参数组成的参数列表等效于空参数列表。
我得到(也许是错误的)印象这是一个旧function,也许是从Cinheritance而来的?
有没有人知道这种方式背后的历史或理由来声明一个没有参数的函数?
在C ++中,它们都意味着相同的东西。
在C f(void)
与f()
不同,becuse f()
表示“未指定的参数” – 您可以合法地传递任何东西(接收数据的函数是否对此感到高兴是另一回事)。
在C ++中,两者都是一样的。
在C中, f()
意味着我们不知道此时函数需要多少个参数。 它是未指定的参数。 而f(void)
意味着该函数不接受任何参数。
从C标准:
6.7.6.3函数声明符(包括原型)
6 /参数类型列表指定函数参数的类型,并可以声明其标识符。
10 /
void
类型的未命名参数作为列表中唯一项的特殊情况指定该函数没有参数。14 /标识符列表仅声明函数参数的标识符。 函数声明符中的空列表是该函数定义的一部分,指定该函数没有参数。 函数声明符中的空列表不是该函数定义的一部分,它指定不提供有关参数数量或类型的信息。
就像你说的那样,在C ++标准中:
8.3.5函数[dcl.fct]
4 / parameter-declaration-clause确定调用函数时可以指定的参数及其处理。 [ 注意: *参数声明子句*用于转换函数调用中指定的参数; 见5.2.2。 – 结束注释 ]如果parameter-declaration-clause为空,则该函数不带参数。 由非依赖类型
void
的单个未命名参数组成的参数列表等效于空参数列表。
这来自C的C ++。在C f()
意味着未知的数量和类型的参数 。 所以在C中没有参数就有f( void )
。
在C ++中它是多余的: f()
和f( void )
意思相同 – 一个没有参数的函数。
来自“C ++历史”(1979-1998,Bjarne Stroustrup)在第11页:
C with Classes为函数f引入了符号f(void),它不带参数作为与f()的对比,在C中声明一个函数可以接受任何类型的任意数量的参数而不进行任何类型检查。
然而,它稍后说,空函数声明器很快就被赋予了它明显的含义和新的构造 – 有点过时了。 我想没有人打扰过它(或者可能已经有一些用它编写的C ++代码需要支持)。
在C:
然而,这种结构在C语言的标准化中发挥了重要作用,其中函数原型直接从C ++借用。 在这种情况下, f(void)
在支持现有C代码时非常有用(其中已经保留了f()
这个概念,表示一个函数采用了未指定数量的参数)。
在此之前,C语言无法将特定类型附加到每个参数,但只有具有未指定数量的参数和未指定类型的函数才能使用f()
forms声明。
在C ++中,没有区别。 但是,这是inheritance自C,其中int f()
表示“可以接受任何类型的任意数量的参数的函数”和int f(void);
指定不带参数的函数。
编辑 As Angew指出,在C中,f()表示“此时参数未知的函数 ”。 这并不意味着它可以接受任意数量的参数 – 接近于f(T arg, ...)
,其中arg
至少是一个在...
之前的命名参数,它接受至少一个参数arg
(as由@hvd指出。