3

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

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

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

4

3 回答 3

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(简短、独立、正确的示例)——感谢您制作了一个!)。代码出现的原因可能有很多(或多或少)。通常,这是因为在分配之后有条件编译的代码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这种表示法保留了单个函数调用,但在未定义时避免了编译器的抱怨。

于 2013-08-31T18:37:17.307 回答
0

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

于 2013-08-31T18:37:04.030 回答
0

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

于 2013-08-31T18:39:04.910 回答