【问题标题】:How can I hide "defined but not used" warnings in GCC?如何在 GCC 中隐藏“已定义但未使用”的警告?
【发布时间】:2008-12-22 13:02:29
【问题描述】:

我有一堆编译时断言,比如:

CASSERT(isTrue) or CASSERT2(isTrue, prefix_)

使用 GCC 编译时,我收到许多警告,例如 'prefix_LineNumber' defined but not used。有没有办法可以隐藏编译时断言的警告?我没有运气搜索 GCC 文档。我想我可能会在同一个宏中自动全局使用 var,但我想不出任何方法。

有人知道在 GCC 中隐藏该警告的方法吗?

【问题讨论】:

    标签: gcc warnings compiler-warnings


    【解决方案1】:

    在寻找这个问题的解决方案时看到了这个帖子。为了完整起见,我在这里发布了我找到的解决方案...

    控制未使用的warnings 的 GCC 编译器标志包括:

    -Wunused-function
    -Wunused-label
    -Wunused-parameter
    -Wunused-value
    -Wunused-variable
    -Wunused (=all of the above)
    

    每一个都有一个相应的否定形式,在 W 之后插入“no-”,这会关闭警告(例如,如果它是由 -Wall 打开的)。因此,在您的情况下,您应该使用

    -Wno-unused-function
    

    当然,这适用于整个代码,而不仅仅是编译时断言。对于特定功能的行为,请查看Function attributes

    【讨论】:

    • 可以按文件设置吗?
    • 这样一个标志的问题是它会隐藏其他可能确实没有使用的变量,应该从你的软件中删除。所以这不是一个好的解决方案。但是,将一个特定的变量标记为愿意不使用会更好(即,在加载库时用于运行某些代码的变量,这是一个简洁的 C++ 功能。)
    【解决方案2】:

    GCC不与其他编译器冲突的解决方案

    #ifdef __GNUC__
    #define VARIABLE_IS_NOT_USED __attribute__ ((unused))
    #else
    #define VARIABLE_IS_NOT_USED
    #endif
    
    int VARIABLE_IS_NOT_USED your_variable;
    

    【讨论】:

    • 这正是它在 gcc 源代码中对未使用的函数参数的处理方式。 +1 :)
    • 我发现使用 ____attribute____ ((____unused____)) 适用于 GCC 4.x.x
    【解决方案3】:

    这是最烦人的警告之一,尽管我不明白检查死代码可能有用(有时)。但是我通常有用于调试的静态函数,或者将来某个时候可能有用的函数,或者只是临时使用的函数,我想将它们保留在代码中。

    幸运的是,这个警告并不关心内联函数。

    inline static foo()
    {
    }
    

    【讨论】:

    • 像一个迷人的东西一样工作......UPVOTED
    • 那么为什么不将这些函数包装在预处理器指令中。例如。 #ifdef UNIT_TEST static foo()?
    【解决方案4】:

    您可以创建一个空语句并将结果强制转换为 void。这可以跨编译器移植,gcc 不会给您任何警告,即使启用了-Wall-Wextra。例如:

    int var;    // var is not used
    (void)var;  // null statement, cast to void -- suppresses warning
    

    一种常见的技术是为此创建一个宏:

    #define UNUSED(x) ((void)(x))
    
    int var;
    UNUSED(var);
    

    【讨论】:

    • 奇怪的是,我仍然收到警告。例如,当我调用 system() 并且不关心返回时:(void)system(cmd.c_str()); 我不明白为什么这会产生警告。
    • @BobDoolittle:嗯,这很有趣,我以前从未见过这种行为。您使用的是什么编译器以及该编译器的哪个版本?
    • gcc 4.8.2 在 Ubuntu 14.04 上。我正在使用 -Wunused-result 编译我的所有源代码,并寻找一种方法来显式抑制那些已验证行为正确的地方的警告。过去我一直使用强制转换 (void),但在这里没有工作。
    • @BobDoolittle:我无法在 Ubuntu 14.04 上使用相同的 gcc 4.8.2 重现该行为。您可以发布/链接SSCCE 以及您传递给编译器的确切命令行参数吗?
    【解决方案5】:
    #define UNUSED_VAR     __attribute__ ((unused))
    

    对于任何变量,只需在其类型之前使用上述宏即可:

    UNUSED_VAR int a = 2;
    

    【讨论】:

    • 我们已将其用于 out 项目。但是,仅适用于编译器在其警告中出错的情况。例如,我们有一些变量只能通过指针访问,因此编译器认为它们是未使用的。禁止此类警告是可以接受的,但必须从我们的代码中删除真正未使用的变量。
    【解决方案6】:

    用以下指令包装这个函数 所有放在 push 和 pop 之间的代码都不会警告你未使用的函数。 其余所有代码(除了 push 和 pop)都不会受到影响。

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wunused-function"
    
    ... your code
    
    #pragma GCC diagnostic pop
    

    【讨论】:

    • 投票。为我工作。
    • 工作就像一个魅力。
    • 这是 2020 年的正确做法。其他答案已过时和/或被破解。
    【解决方案7】:

    如果不知道静态断言宏的详细信息,这很难回答。也许您可以更改为不同的宏来避免这个问题?您可以按照建议将“未使用”属性添加到宏中,也可以使用其他形式的 CASSERT()。

    以下是一些替代方案的描述:

    http://www.jaggersoft.com/pubs/CVu11_3.html

    http://blog.kowalczyk.info/kb/compile-time-asserts-in-c.html

    http://www.pixelbeat.org/programming/gcc/static_assert.html

    【讨论】:

      【解决方案8】:

      -Wunused-label 怎么样?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多