【问题标题】:Why cast an unused function parameter value to void?为什么要将未使用的函数参数值强制转换为 void?
【发布时间】:2011-01-10 14:14:59
【问题描述】:

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

这两个无效化有什么用吗?

【问题讨论】:

  • 投票结束,因为正确的答案(禁止编译器警告未使用的参数)在 Charles 的链接问题中。
  • @Cody Gray - 因为这个原因它被关闭了。然而,它实际上并不是这个问题的重复。 689677 正在讨论将返回值转换为 void,而不是参数。
  • 实际上这两个重复项对这个问题都无效。一个是 C++,另一个是关于返回值。 这些不是一回事。是否有任何 C 参数重复?
  • 这是一个与建议的重复内容不同的问题。不过,我明白为什么会犯这个错误。重新打开(显然)。
  • 注意:请不要将其作为 C++ 问题的副本关闭,因为 C++ 使用 (void) 会产生不同的效果。这个问题是关于 C

标签: c casting void


【解决方案1】:

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

【讨论】:

  • 抑制警告的最佳方法是什么:stackoverflow.com/questions/3417837/…
  • @Benoit 强制转换为 void 实际上有什么作用?它的唯一功能是向编译器显示您有意忽略某事或 (void) 确实做了某事,当编译器看到它时,它只会将其视为对变量做了某事,因此不会发出警告?
  • @TanWang 它的唯一功能是向编译器显示您有意忽略了某些内容。它在运行时不会做任何事情。
  • 有人知道这在哪里记录吗?语言规范?编译手册?它有名字吗(这样的说法)?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 2016-08-05
    • 2012-03-17
    • 2016-08-07
    • 2014-01-26
    • 2013-06-03
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    相关资源
    最近更新 更多