【问题标题】:GCC Wunused-variable warns for used variableGCC Wunused-variable 警告使用的变量
【发布时间】: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


【解决方案1】:

情况并非如此,至少在您提供的示例中是这样。这是Minimal, Complete, and Verifiable 演示:

#include <stdio.h>

#define compare(a,b) ( ((a) == (b)) ? 1 : 0 )

int f1() {
    return 42;
}

void f() { // your code
    int a;
    a = f1();
    if (compare(a, 123))
        printf("It works");
}

int main(int argc, char *argv[]) {
    f();
    return 0;
}

当使用 gcc 8.2 或 7.3 使用 gcc -Wall -Wunused(是的,这是多余的)编译时,不会出现警告或错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多