为什么将一个未使用的函数参数值转换为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)强制转换的地方 – 它会明确而明确地告诉编译器,声明应该完全没有任何效果。

Interesting Posts