什么是“(void)temp;”声明的意思?

时间:2013-08-31 18:35:04

标签: c

我正在浏览一些代码并遇到一段代码,如下所示: -

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

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

3 个答案:

答案 0 :(得分:6)

这意味着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时避免编译器的抱怨。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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