首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C void参数"void foo(void)“还是不使用"void foo()”更好?

使用C void参数"void foo(void)“还是不使用"void foo()”更好?
EN

Stack Overflow用户
提问于 2009-03-28 23:44:30
回答 6查看 137.1K关注 0票数 246

哪个更好:void foo()还是void foo(void)?使用void时,它看起来丑陋且前后不一致,但有人告诉我它很好。这是真的吗?

编辑:我知道一些老的编译器会做一些奇怪的事情,但是如果我只使用GCC,void foo()可以吗?那么foo(bar);会被接受吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-03-28 23:48:31

代码语言:javascript
复制
void foo(void);

这是在C中说“没有参数”的正确方式,在C++中也是如此。

但是:

代码语言:javascript
复制
void foo();

在C和C++中意味着不同的事情!在C中,它的意思是“可以接受任何数量的未知类型的参数”,而在C++中,它的意思与foo(void)相同。

可变参数列表函数本质上是非类型安全的,应该尽可能避免。

票数 302
EN

Stack Overflow用户

发布于 2009-03-29 00:41:49

在C中有两种指定参数的方法,一种是使用标识符列表,另一种是使用参数类型列表。可以省略标识符列表,但不能省略类型列表。因此,要说一个函数在函数定义中不带参数,您可以使用(省略的)标识符列表

代码语言:javascript
复制
void f() {
    /* do something ... */
}

下面是一个参数类型列表:

代码语言:javascript
复制
void f(void) {
    /* do something ... */
}

如果在参数类型列表中只有一个参数类型是void (那么它必须没有名称),那么这意味着函数没有参数。但是这两种定义函数的方式在声明的内容上有所不同。

标识符列表

第一个定义函数接受特定数量的参数,但既不传递计数,也不传递所需内容的类型-就像所有使用标识符列表的函数声明一样。因此,调用者必须事先准确地知道类型和计数。因此,如果调用者调用函数并给它一些参数,则行为是未定义的。例如,堆栈可能会损坏,因为被调用的函数在获得控制权时需要不同的布局。

不推荐在函数参数中使用标识符列表。它在过去使用过,现在仍然存在于许多生产代码中。它们可能会因为这些参数提升而导致严重的危险(如果提升的参数类型与函数定义的参数类型不匹配,则行为也是未定义的!)当然,也不太安全。因此,对于没有参数的函数,总是使用void之类的东西,只在函数的声明和定义中使用。

参数类型列表

第二个定义了函数接受零个参数,并与之进行通信-就像所有使用参数类型列表声明函数的情况一样,该列表被称为prototype。如果调用者调用函数并给它一些参数,那就是一个错误,编译器会输出一个适当的错误。

声明函数的第二种方法有很多好处。当然,其中之一是检查参数的数量和类型。另一个不同之处在于,因为编译器知道参数类型,所以它可以将参数的隐式转换应用于参数类型。如果不存在参数类型列表,则无法执行此操作,并且参数将被转换为提升的类型(这称为默认参数提升)。例如,char将变为int,而float将变为double

函数的复合类型

顺便说一句,如果一个文件同时包含省略的标识符列表和参数类型列表,则参数类型列表“获胜”。末尾的函数类型包含一个原型:

代码语言:javascript
复制
void f();
void f(int a) {
    printf("%d", a);
}

// f has now a prototype. 

这是因为这两个声明都没有说任何相互矛盾的东西。然而,第二个人还有一些话要说。那就是一个论点被接受了。同样的事情也可以反过来做。

代码语言:javascript
复制
void f(a) 
  int a;
{ 
    printf("%d", a);
}

void f(int);

第一个方法使用标识符列表定义函数,而第二个方法则使用包含参数类型列表的声明提供函数的原型。

票数 98
EN

Stack Overflow用户

发布于 2009-03-28 23:46:13

void foo(void)更好,因为它显式地声明:不允许参数。

void foo()意味着您可以(在某些编译器下)发送参数,至少如果这是您的函数的声明而不是它的定义。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/693788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档