C和C ++在这方面是不同的。
C 2011在线标准
6.7.6.3函数声明符(包括原型)
...
10 void
在列表中唯一的类型为类型的未命名参数的特殊情况表明函数没有参数。
...
14标识符列表仅声明函数参数的标识符。作为该函数定义的一部分的函数声明器中的空列表表示该函数没有参数。不属于该函数定义的一部分的函数声明器中的空列表指定不提供有关参数数量或类型的信息。145)
简而言之,函数声明中的空参数列表表示该函数采用了未指定数量的参数,而函数定义中的空参数列表表示该函数不采用任何参数。
T foo( void ); // declaration, foo takes no parameters
T bar(); // declaration, bar takes an *unspecified* number of parameters
T foo( void ) { ... } // definition, foo takes no parameters
T bar() { ... } // definition, bar takes no parameters
就C而言,切勿在函数声明或定义中使用空的标识符列表。如果函数不接受任何参数,请void
在参数列表中使用进行指定。
在线C ++标准
8.3.5函数[dcl.fct]
...
4 参数声明子句确定在调用函数时可以指定的参数及其处理。[ 注:该参数声明子句用于在函数调用指定的参数转换; 见5.2.2。— 结束注释 ]如果parameter-declaration-clause为空,则该函数不接受任何参数。由单个非依赖类型的未命名参数组成的参数列表void
等效于空参数列表。除此特殊情况外,参数不得具有type cv void
。如果参数声明子句以省略号或功能参数包(14.5.3)终止,参数的数量应等于或大于没有默认参数且不是功能参数包的参数的数量。如果在语法上正确,并且“ ...”不是抽象声明符的一部分,则“,...”与“ ...”同义。[ 例子:声明 int printf(const char*, ...);
声明一个可以用不同数量和类型的参数调用的函数。 printf("hello world");
printf("a=%d b=%d", a, b);
然而,第一个参数必须是这样的类型,可以被转换成的const char*
- 端示例 ] [ 注:该标准报头<cstdarg>
包含用于访问参数的机构使用省略号合格(参见5.2.2和18.10)。— 尾注 ]
对于C ++,声明或定义中的参数列表为空表示该函数不接受任何参数,等效于使用的参数列表void
。