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

时间:2011-01-10 14:14:59

标签: 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;
}

这两个演员是否可以用于任何目的?

2 个答案:

答案 0 :(得分:81)

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

答案 1 :(得分:10)

原型中未使用参数的原因通常是因为函数需要符合某些外部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将生成另一个警告:

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

警告告诉语句ud;虽然在语法上是有效的C,但根本不会影响任何内容,并且可能是一个错误,与语句

不同
abort;

或许应该写成abort();而不是为了做某事。

这就是(void)强制转换的地方 - 它会明确地告诉编译器该语句应该完全没有效果。