哪个更好:void foo()还是void foo(void)?使用void时,它看起来丑陋且前后不一致,但有人告诉我它很好。这是真的吗?
编辑:我知道一些老的编译器会做一些奇怪的事情,但是如果我只使用GCC,void foo()可以吗?那么foo(bar);会被接受吗?
发布于 2009-03-28 23:48:31
void foo(void);这是在C中说“没有参数”的正确方式,在C++中也是如此。
但是:
void foo();在C和C++中意味着不同的事情!在C中,它的意思是“可以接受任何数量的未知类型的参数”,而在C++中,它的意思与foo(void)相同。
可变参数列表函数本质上是非类型安全的,应该尽可能避免。
发布于 2009-03-29 00:41:49
在C中有两种指定参数的方法,一种是使用标识符列表,另一种是使用参数类型列表。可以省略标识符列表,但不能省略类型列表。因此,要说一个函数在函数定义中不带参数,您可以使用(省略的)标识符列表
void f() {
/* do something ... */
}下面是一个参数类型列表:
void f(void) {
/* do something ... */
}如果在参数类型列表中只有一个参数类型是void (那么它必须没有名称),那么这意味着函数没有参数。但是这两种定义函数的方式在声明的内容上有所不同。
标识符列表
第一个定义函数接受特定数量的参数,但既不传递计数,也不传递所需内容的类型-就像所有使用标识符列表的函数声明一样。因此,调用者必须事先准确地知道类型和计数。因此,如果调用者调用函数并给它一些参数,则行为是未定义的。例如,堆栈可能会损坏,因为被调用的函数在获得控制权时需要不同的布局。
不推荐在函数参数中使用标识符列表。它在过去使用过,现在仍然存在于许多生产代码中。它们可能会因为这些参数提升而导致严重的危险(如果提升的参数类型与函数定义的参数类型不匹配,则行为也是未定义的!)当然,也不太安全。因此,对于没有参数的函数,总是使用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);第一个方法使用标识符列表定义函数,而第二个方法则使用包含参数类型列表的声明提供函数的原型。
发布于 2009-03-28 23:46:13
void foo(void)更好,因为它显式地声明:不允许参数。
void foo()意味着您可以(在某些编译器下)发送参数,至少如果这是您的函数的声明而不是它的定义。
https://stackoverflow.com/questions/693788
复制相似问题