103

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

这两个无效的演员有任何目的吗?

4

2 回答 2

95

它是为了避免来自编译器的警告,因为某些参数未使用。

于 2011-01-10T14:19:03.473 回答
15

在原型中有未使用的参数的原因通常是因为函数需要符合一些外部 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)用武之地——它将明确而明确地告诉编译器该语句应该完全没有任何效果。

于 2017-08-24T07:16:55.227 回答