【问题标题】:Why does GCC's diagnostic pragma fail for some warning types?为什么 GCC 的诊断编译指示对于某些警告类型会失败?
【发布时间】:2015-02-12 22:25:17
【问题描述】:

我注意到 GCC 的诊断编译指示只支持一些警告。

这行得通:

#pragma GCC diagnostic error "-Wconversion"

这失败了:

#pragma GCC diagnostic error "-Wframe-larger-than=32"

...出现错误:

error: unknown option after '#pragma GCC diagnostic' kind [-Werror=pragmas]
#pragma GCC diagnostic error "-Wframe-larger-than"

..当作为命令行参数传递时,这两个参数都适用于 GCC。


有没有 GCC diagnostic pragma 支持警告的文档?

【问题讨论】:

    标签: c pragma gcc-warning


    【解决方案1】:

    我怀疑您在 GCC 中发现了此特定选项的错误。

    使用以下基本示例(参见 live):

    #include <stdio.h>
    
    int main(void)
    {
        int i = 4;
    
        printf("%d\n", i);
    
        return 0;
    }
    

    -Wframe-larger-than=2编译有明显的警告信息:

    警告:16 字节的帧大小大于 2 字节 [-Wframe-larger-than=]

    但是,结合-Werror=(即完整标志为-Werror=frame-larger-than=2),它的行为方式很奇怪:

    错误:16字节的帧大小大于1字节 [-Werror=frame-larger-than=]

    更奇怪的是,这个值看起来完全被忽略了,因为-Werror=frame-larger-than=64 仍然会产生同样的错误,尽管满足了阈值(即 16 p>

    (旁注:GCC 版本为 4.9.0)

    我相信-Werror= 选项处理与#pragma GCC diagnostic error 有某种联系,因为以下似乎有效:

    #include <stdio.h>
    
    #pragma GCC diagnostic error "-Wframe-larger-than="
    int main(void)
    {
        int i = 4;
    
        printf("%d\n", i);
    
        return 0;
    }
    

    返回错误为:

    错误:16字节的帧大小大于1字节 [-Werror=frame-larger-than=]

    但它无法与任何值配合,例如:

    #pragma GCC diagnostic error "-Wframe-larger-than=2"
    

    产生:

    警告:“#pragma GCC 诊断”种类后的未知选项 [-Wpragmas]

    【讨论】:

      【解决方案2】:

      这是我发现的最好的东西:

      GCC 手册this:

      pragma GCC 诊断类型选项: 修改诊断的处置。请注意,并非所有诊断都是可修改的;目前只能控制警告(通常由'-W...'控制),而不是所有警告。使用 -fdiagnostics-show-option 来确定哪些诊断是可控的,哪些选项可以控制它们。

      还有this 的 GCC 手册:

      目前,只有 C++ 前端可以支持这些选项。 …… -fdiagnostics 显示选项: 此选项指示诊断机制将文本添加到发出的每个诊断信息,当诊断机制已知此类选项时,该选项指示哪个命令行选项直接控制该诊断。

      https://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Language-Independent-Options.htm
      

      【讨论】:

      • 那么结论是什么?为什么失败的答案是什么?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多