我正在浏览一些代码并遇到一段代码,如下所示: -
void func(int a)
{
int temp;
...
....
temp=a;
(void)temp;
}
temp变量在这里做什么?如果我使用-Wall选项编译它,我也不会收到任何编译错误或警告。请帮我理解这段代码风格。 感谢。
答案 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
来丢弃表达式的结果(这意味着“没有类型“)。