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

bas*_*ibe 93 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;
}
Run Code Online (Sandbox Code Playgroud)

这两个演员是否有任何目的?

Ben*_*ery 84

它是为了避免编译器发出警告,因为某些参数未使用.

  • 抑制警告的最佳方法是:http://stackoverflow.com/questions/3417837/what-is-the-best-way-to-supress-unused-variable-x-warning (3认同)
  • @TanWang它唯一的功能是向编译器显示你故意忽略的东西.它不会在运行时执行任何操作. (2认同)

Ant*_*ala 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) {
                      ^~
Run Code Online (Sandbox Code Playgroud)

使用函数体中的实际参数可以抑制此警告.例如,如果您有以下语句:

ud;
Run Code Online (Sandbox Code Playgroud)

此警告现已被取消.但是现在GCC会发出另一个警告:

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~
Run Code Online (Sandbox Code Playgroud)

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

abort;
Run Code Online (Sandbox Code Playgroud)

也许应该写成abort();代替它来做某事.

这就是(void)演员阵容的来源 - 它将明确地告诉编译器该语句应该完全没有任何影响.