25

在 C++11 中,以下函数声明:

int f(void);

意思相同:

int f();

由非依赖类型 void 的单个未命名参数组成的参数列表等效于空参数列表。

我得到(可能是错误的)印象这是一个旧功能,可能是从 C 继承的?

有谁知道以这种方式声明没有参数的函数背后的历史或基本原理?

4

5 回答 5

23

在 C++ 中,它们的含义相同。

在 Cf(void)中与 不同f(),因为f()意味着“未指定的参数” - 您可以合法地传递任何东西(接收数据的函数是否对此感到满意是另一回事)。

于 2013-08-22T09:41:32.770 回答
11

在 C++ 中,两者都是一样的。

在 C 中,f()意味着我们此时不知道函数需要多少参数。它是未指定的参数。并且f(void)意味着这个函数不带任何参数。

从 C 标准:

6.7.6.3 函数声明器(包括原型)

6/ 参数类型列表指定函数参数的类型,并且可以声明函数参数的标识符。

10/ 作为列表中唯一项目的未命名类型参数的特殊情况void指定该函数没有参数。

14/ 标识符列表仅声明函数参数的标识符。作为该函数定义的一部分的函数声明器中的空列表指定该函数没有参数。不属于该函数定义的函数声明器中的空列表指定不提供有关参数数量或类型的信息。

就像你说的,在 C++ 标准中:

8.3.5 函数[dcl.fct]

4/ parameter-declaration-clause确定在调用函数时可以指定的参数及其处理。[注: *parameter-declaration-clause*用于转换函数调用上指定的参数;见 5.2.2。—<em>end note ] 如果参数声明子句为空,则该函数不接受任何参数。由单个非依赖类型的未命名参数组成的参数列表void等效于空参数列表。

于 2013-08-22T09:43:16.200 回答
3

这来自 C 的 C++。在 Cf()中意味着未知数量和类型的参数。所以在 C 中对于没有参数f( void ).

在 C++ 中它是多余的:f()并且f( void )意味着同样的事情 - 一个没有参数的函数。

于 2013-08-22T09:42:29.070 回答
1

在 C++ 中,没有区别。但是,这是从 C 继承的,其中的int f()意思是“可以接受任意数量的任何类型的参数的int f(void);函数”并指定不接受任何参数的函数。

编辑正如 Angew 指出的那样,在 C 中, f() 表示“此时参数未知的函数”。这并不意味着它可以接受任意数量的参数 - 接近于f(T arg, ...),其中arg至少有一个命名参数 before ...,它接受至少一个参数,arg(如@hvd 所指出的那样)。

于 2013-08-22T09:40:23.517 回答
1

摘自“A History of C++”(Bjarne Stroustrup 于 1979-1991 年)第 11 页:

带有类的 C 为不带参数的函数 f 引入了符号 f(void),这与在 C 中声明的函数可以接受任意数量的任何类型的参数而无需任何类型检查的函数 f() 形成对比。

然而,它后来说,很快空函数声明器就被赋予了明显的含义,而新的构造——在当时有点过时了。我想没有人会在之后将它移除(或者可能已经有一些用它编写的 C++ 代码需要支持)。

在 C 中:

然而,这种结构在 C 语言标准化中发挥了重要作用,其中函数原型直接从 C++ 借来。在这种情况下f(void),在支持现有的 C 代码时很有用(其中f()已经保留了这个概念,以指示函数采用未指定数量的参数)。

在此之前,C 语言无法将特定类型附加到每个参数,但只有具有未指定数量的参数和未指定类型的函数才能使用该f()表单进行声明。

于 2017-03-18T13:37:20.890 回答