【发布时间】:2019-01-17 20:18:45
【问题描述】:
我使用的是 GCC 版本 8.2 在几段代码中,我使用了小函数。在每个功能上,我都有测试(即 Unity 框架测试)。测试被定义为#define 宏,测试非常具体的东西。例如,如果一个数字是正数。
现在,当使用 -Wextra 标志编译代码时,我收到有关未使用变量的警告,尽管我在定义的宏上使用它们。
问题是,GCC 没有将宏识别为使用变量,还是我遗漏了什么?
例子:
#define compare(a,b) ( ((a) == (b)) ? 1 : 0 )
...
void f() {
int a;
a = f1();
if(compare(a,123))
printf("It works");
}
在这种情况下,GCC 会警告未使用的变量 a,尽管它正在被宏使用(除了被函数 f1() 赋予一个值)。
【问题讨论】:
-
嗯。不知何故,在这里很难相信你。请发布minimal reproducible example 和确切的编译器输出。
-
什么是
f1?它返回什么?难道编译器推断a将从不 或总是 等于123并因此优化“使用”了?您可以尝试查看生成的汇编代码以找出答案。 -
@Someprogrammerdude 那样的话会有不同的警告,比如“表达式永远为真”之类的。
-
感谢大家的快速回复。我可以发布整个示例,因为它是一个巨大的复杂系统。我试图尽可能减少示例代码来解释我遇到的问题。我将尝试创建一个小的工作示例,给我结果并尽快返回
标签: c gcc compiler-flags