为什么将未使用的函数参数值转换为void?


98

在某些C项目中,我看到了以下代码:

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}

无效的两个演员有什么用吗?


投票结束,因为正确的答案(禁止编译器警告未使用的参数)在Charles的链接问题中。
TED

@Cody Gray-由于这个原因而关闭。但是,实际上这实际上不是该问题的重复。689677谈论的是强制转换返回无效,而不是参数。
TED

19
实际上,两个副本对这个问题均无效。一个是C ++,另一个是关于返回值。这些不是同一回事。是否有C参数重复项?
马特·乔纳

2
这与建议的重复内容涵盖的内容不同。我可以理解为什么会出错。重新打开(显然)。
Tim Post

4
注意:请不要将其作为C ++问题的副本来关闭,因为C ++会(void)产生不同的效果。这个问题是关于C
Antti Haapala

Answers:


89

它可以避免编译器发出警告,因为某些参数尚未使用。



@Benoit强制转换为无效实际上是做什么的?它的唯一功能是向编译器显示您有意忽略某件事或确实(void)做某事,而当编译器看到它时,它只会将其视为已对该变量做了某件事,因此不会发出警告?
Tan Wang'9

2
@TanWang它的唯一功能是向编译器显示您有意忽略某些内容。它在运行时不会做任何事情。
zwol

14

在原型中使用未使用的参数的原因通常是因为该函数需要符合某些外部API的要求-也许它是一个库函数,或者指向该函数的指针传递给了另一个需要此调用约定的函数。但是,并不是函数本身本身实际上确实需要调用约定使用的所有参数。

在主体中提及参数名称的原因是为了避免出现类似的警告

unused.c: In function l_alloc’:
unused.c:3:22: warning: unused parameter ud [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

使用功能体内的实际参数可以抑制该警告。例如,如果您有以下语句:

ud;

现在,此警告已取消。但是,现在,海湾合作委员会将再次发出警告:

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

警告表明该语句ud;尽管在语法上是有效的C,但它根本不影响任何内容,并且可能是一个错误,与该语句不同

abort;

也许应该写成abort();它要做某事。

这就是强制转换的地方(void)-它会明确明确地告诉编译器该语句应该根本没有任何作用。

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.