为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
开心每一天1111 2019-06-25 16:52:35
使用C void参数“voidfoo(Void)”还是不使用“voidfoo()”更好?更好的是:void foo()或void foo(void)?它看起来丑陋和不一致,但我被告知它是好的。这是真的吗?编辑:我知道有些老编译器会做一些奇怪的事情,但是如果我只使用GCC,是void foo()好的?将要foo(bar);然后被接受?
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

void foo(void);

这是在C中说“无参数”的正确方法,它也适用于C+。

但是:

void foo();

在C和C+中意味着不同的东西!在C中,它的意思是“可以接受任意数量的未知类型的参数”,而在C+中,它的意思是foo(void).

变量参数列表函数本质上是非类型的,在可能的情况下应该避免。


查看完整回答
反对 回复 2019-06-25
?
隔江千里

TA贡献1906条经验 获得超10个赞

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);

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


查看完整回答
反对 回复 2019-06-25
?
MYYA

TA贡献1868条经验 获得超4个赞

void foo(void)更好,因为它明确指出:不允许参数。

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


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 560 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信