【问题标题】:What does "(void)temp;" statement mean? [duplicate]"(void)temp;" 是什么意思?声明是什么意思? [复制]
【发布时间】:2013-09-01 03:02:46
【问题描述】:

我正在浏览一些代码,并遇到了这样一段代码:-

void func(int a)
{
   int temp;
       ...
       ....
   temp=a;
   (void)temp;
}

临时变量在这里做什么?如果我使用 -Wall 选项编译它,我也不会收到任何编译错误或警告。请帮助我理解这种代码风格。 谢谢。

【问题讨论】:

  • 在您发布的实际 sn-p 中,(void)temp 看起来确实很奇怪。
  • NPE 所说的。在这种情况下,您确实希望编译器对此发出警告,因此您可以删除不必要的本地。

标签: c


【解决方案1】:

这意味着 temp 的值在其他情况下未被使用,优化编译器会警告它(变量已设置但未使用),但是通过包含 (void)temp;,您(当前)在没有来自的警告的情况下逃脱编译器。该行不生成代码,也不生成编译器警告。

给出源代码:

extern void func(int a);
void func(int a)
{
   int temp;
   temp = a;
   //(void)temp;
}

Mac OS X 10.8.4 上的 GCC 4.8.1 给出代码警告:

$ gcc -O3 -g -std=c11 -Wall -Wextra -c void.c
void.c: In function ‘func’:
void.c:4:8: warning: variable ‘temp’ set but not used [-Wunused-but-set-variable]
    int temp;
        ^
$

删除注释标记(因此编译了(void)temp;),编译不会产生警告。


这显然是从更大的上下文中提取的示例代码(SSCCE (Short, Self-Contained, Correct Example) — 感谢您制作了一个!)。代码出现的原因可能有很多(或多或少)。通常,这是因为在分配给temp 之后有条件编译的代码将使用分配的值。它通常不是函数参数的赋值,而是函数调用的结果:

void func(int a)
{
    int temp;
    ...
    temp = some_function(a);
#if defined(SOMETHING_OR_OTHER)
    ...do stuff with temp...
#else
    (void)temp;
#endif
}

这种表示法保留了单个函数调用,但在未定义 SOMETHING_OR_OTHER 时避免了编译器的抱怨。

【讨论】:

  • 非常感谢您的解释。
  • 我在使用 gcc 版本 (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 的 Ubuntu 机器上尝试了 gcc -O3 -g -Wall -Wextra -c void.c 但我没有得到任何错误或警告。是的,你是对的。 temp 收集系统调用的返回值,即 write()。但是 func() 本身并没有条件编译。不过感谢您的指点。我会在浏览代码时记住这一点。
  • 在 GCC 4.6.0 中添加了“设置但未使用”警告;它不在 GCC 4.5.x 中。我能够测试 4.5.1、4.5.2、4.6.0、4.7.0、4.7.1、4.8.1(我保留了它们的副本——但 4.4.2 实例已损坏,缺少一个库)。
【解决方案2】:

欺骗编译器:假装使用temp,但实际上什么都不做。

【讨论】:

    【解决方案3】:

    它计算表达式temp(一个简单但仍然有效的表达式)并告诉编译器通过将表达式的结果转换为void(这意味着“无类型”)来丢弃表达式的结果.

    【讨论】:

      猜你喜欢
      • 2019-12-25
      • 2020-05-01
      • 1970-01-01
      • 2019-12-08
      • 2011-11-19
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      相关资源
      最近更新 更多