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

C 为什么要将未使用的函数参数值强制转换为void?,c,casting,void,C,Casting,Void,在一些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; } void的两个强制转换是否有任何用途?它是为了避免编译器发出警告,因为有些参数未使用。原型中有未使用参数的原因通常是因为函数需

在一些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;
}

void的两个强制转换是否有任何用途?

它是为了避免编译器发出警告,因为有些参数未使用。

原型中有未使用参数的原因通常是因为函数需要符合某些外部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;
此警告现在被抑制。但是,现在GCC将产生另一个警告:

此警告表示语句
ud,虽然在语法上是有效的C,但根本不会影响任何东西,而且可能是一个错误,与语句类似

abort;
可能应该写为
abort()而是让它做一些事情


这就是
(void)
强制转换的作用所在-它将明确无误地告诉编译器该语句应该完全没有任何效果。

投票关闭,作为正确答案(禁止编译器警告未使用的参数)是在查尔斯的相关问题中。@Cody Gray-因为这个原因它被关闭了。但事实上,这并不是一个重复的问题。689677谈论的是铸造返回到无效状态,而不是参数。实际上,这两个副本对这个问题都无效。一个是C++,另一个是返回值。这些是不同的事情。是否存在任何重复的C参数?这与建议的重复参数所涵盖的问题不同。不过,我明白为什么会犯这个错误。注意:请不要关闭这个作为C++问题的复制,因为C++使用了<代码>(空) >有不同的效果。这个问题是关于CWhat是抑制警告的最佳方式:@Benoit“强制释放无效”实际上做了什么?它的唯一功能是向编译器显示您有意忽略某些内容或确实(void)执行某些操作,当编译器看到它时,它只会把它算作对变量做了什么,因此不会发出警告?@TanWang它唯一的功能是向编译器显示你故意忽略了什么。它在运行时不会执行任何操作。
abort;