在一些 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将产生另一个警告:
unused.c:5:5: warning: statement with no effect [-Wunused-value]
ud;
^~
这个警告表示语句ud;
在语法上是正确的C语言代码,但实际上不会对任何东西产生影响,可能是一个错误,就像下面的语句一样:
abort;
也许应该将其编写为abort();
,以使其执行某些操作。
这就是 (void)
强制转换的作用 - 它将明确、明确地告诉编译器该语句实际上根本不会产生任何影响。
(void)
的效果略有不同。这个问题是关于C语言的。 - Antti Haapala -- Слава Україні