function()和function(void)有什么区别?


27

我听说写这样的函数不接收任何东西是一个好习惯,例如:

int func(void);

但是我听到表达这种声音的正确方法是这样的:

int func();

在C和C ++中,这两个函数声明之间有什么区别?


5
这是一个重复的站点网络上一千其他问题,其他各方之间stackoverflow.com/questions/18167390/...
拉斯Viklund

@LarsViklund,如果此站点上有问题,则仅重复。我找不到一个,所以无论SO是什么,这都不是重复的。如果没有别的,可能值得把这个问题作为一个路标。


1
我们在聊天中讨论了 @LightnessRacesinOrbit 并决定对其进行一些修改。

Answers:


17

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


35

在C语言中,具有空参数列表的函数()可以将任何参数用作参数。从字面上看。通常,这用于实现可以带有可变数量参数的函数,尽管如今,最好将更明确的省略号语法(...)用于这些函数。

在C语言中,与参数列表功能(void)明确需要什么了它的参数。这意味着如果您尝试传递某些内容,编译器实际上可以告诉您您犯了一个错误。

在C ++中,这些函数声明是等效的。空白的参数列表表示“无参数” void


回复:“这通常用于实现可以接受可变数量参数的函数”:您是否确定?我认为我从未见过使用显式参数列表对非可变函数和可变函数进行正向声明()的程序。您是否有使用此约定的程序示例?
ruakh

4
AC可变参数函数必须使用...语法定义,并且必须至少具有一个命名参数。使用定义此类函数()会导致未定义的行为-并且函数主体无法使用其中定义的宏<stdarg.h>来读取参数值。自1989/1990年标准以来就是这种情况。
基思·汤普森

@KeithThompson:这个问题和这个答案都在谈论预声明,而不是函数定义。
ruakh 2015年

3
@ruakh:必须使用语法声明定义可变参数函数...以避免未定义的行为。
基思·汤普森
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.