为什么将一个未使用的函数参数值转换为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; }
这两个表决无效用于任何目的?
这是为了避免编译器的警告,因为有些参数是未使用的。
在原型中有未使用的参数的原因通常是因为函数需要符合一些外部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)
强制转换的地方 – 它会明确而明确地告诉编译器,声明应该完全没有任何效果。