猿问

使用C void参数“voidfoo(Void)”还是不使用“voidfoo()”更好?

使用C void参数“voidfoo(Void)”还是不使用“voidfoo()”更好?

更好的是:void foo()void foo(void)?它看起来丑陋和不一致,但我被告知它是好的。这是真的吗?

编辑:我知道有些老编译器会做一些奇怪的事情,但是如果我只使用GCC,是void foo()好的?将要foo(bar);然后被接受?


开心每一天1111
浏览 561回答 3
3回答

幕布斯6054654

void foo(void);这是在C中说“无参数”的正确方法,它也适用于C+。但是:void foo();在C和C+中意味着不同的东西!在C中,它的意思是“可以接受任意数量的未知类型的参数”,而在C+中,它的意思是foo(void).变量参数列表函数本质上是非类型的,在可能的情况下应该避免。

隔江千里

C中有两种指定参数的方法,一种是使用标识符列表,另一种是使用参数类型列表。可以省略标识符列表,但类型列表不能。因此,要说一个函数在函数定义中不接受参数,您可以使用一个(省略的)标识符列表来完成此操作。void f() {     /* do something ... */}它有一个参数类型列表:void f(void) {     /* do something ... */}如果在参数类型列表中,只有一个参数类型是无效的(它必须没有名称),那么这意味着函数没有参数。但这两种定义函数的方法在声明什么方面有差异。标识符列表第一个定义函数接受特定数量的参数,但既没有传递计数,也没有传递所需内容的类型-就像使用标识符列表的所有函数声明一样。所以打电话的人必须事先准确地知道类型和计数。因此,如果调用者调用给它一些参数的函数,则行为是未定义的。例如,堆栈可能会损坏,因为被调用的函数在获得控制时需要不同的布局。不建议在函数参数中使用标识符列表。它在过去使用过,现在仍然存在于许多生产代码中。由于这些参数提升,它们可能造成严重的危险(如果提升参数类型与函数定义的参数类型不匹配,行为也是未定义的!)当然也不太安全。所以,请始终使用void对于没有参数的函数,只有在声明和函数的定义中。参数类型表第二个函数定义为零参数,并与所有使用参数类型列表(称为参数类型列表)声明函数的情况进行通信。prototype..如果调用者调用该函数并给它提供一些参数,这就是一个错误,编译器将产生一个适当的错误。第二种声明函数的方法有很多好处。当然,其中之一是检查参数的数量和类型。另一个不同之处在于,因为编译器知道参数类型,所以它可以将参数的隐式转换应用到参数的类型。如果不存在参数类型列表,则不能这样做,并且参数被转换为提升类型(这称为默认的参数提升)。char会变成int,例如,float会变成double.函数的复合类型顺便说一句,如果一个文件同时包含一个省略的标识符列表和一个参数类型列表,那么参数类型列表“获胜”。函数末尾的类型包含一个原型:void f();void f(int a) {     printf("%d", a);}// f has now a prototype.这是因为这两项声明没有任何矛盾之处。然而,第二个国家还有话要说。那就是有一个论点被接受了。同样的情况也可以反向进行。void f(a)    int a;{      printf("%d", a);}void f(int);前者使用标识符列表定义函数,而第二个则使用包含参数类型列表的声明为其提供原型。

MYYA

void foo(void)更好,因为它明确指出:不允许参数。void foo()意味着您可以(在某些编译器下)发送参数,至少如果这是函数的声明而不是它的定义。
随时随地看视频慕课网APP
我要回答