我正在浏览一些代码,遇到了一段代码,如下所示:-
void func(int a)
{
int temp;
...
....
temp=a;
(void)temp;
}
临时变量在这里做什么?如果我使用 -Wall 选项编译它,我也不会收到任何编译错误或警告。请帮助我理解这种代码风格。谢谢。
我正在浏览一些代码,遇到了一段代码,如下所示:-
void func(int a)
{
int temp;
...
....
temp=a;
(void)temp;
}
临时变量在这里做什么?如果我使用 -Wall 选项编译它,我也不会收到任何编译错误或警告。请帮助我理解这种代码风格。谢谢。
这意味着 的值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
这种表示法保留了单个函数调用,但在未定义时避免了编译器的抱怨。
欺骗编译器:假装temp
被使用,但实际上什么也不做。
它计算表达式temp
(一个简单但仍然有效的表达式)并告诉编译器通过将表达式的结果转换为void
(这意味着“无类型”)来丢弃表达式的结果。