代码之家  ›  专栏  ›  技术社区  ›  shodanex

选择性地删除警告消息gcc

  •  30
  • shodanex  · 技术社区  · 17 年前

    这段代码:

    Int32 status;
    printf("status : %x", status)
    

    给我以下警告:

    jpegthread.c:157: warning: format '%x' expects type 'unsigned int', but argument 3 has type 'Int32'
    

    我知道我可以通过强制转换类型来消除它,但是是否可以使用gcc编译器标志来消除特定类型的警告,并且仍然使用 -Wall ?

    4 回复  |  直到 9 年前
        1
  •  65
  •   Jonathan Leffler    10 年前

    如果需要该代码可移植,则应将参数强制转换为 无符号整型 ,因为在某些平台上,int类型的大小可能与int32不同。

    要回答关于禁用GCC中特定警告的问题,可以使用 - WXXXX 并用 - Wno XXXX .

    GCC Warning Options :

    您可以请求许多特定的警告,选项开始 -W ,例如 -Wimplicit 对隐式声明请求警告。每个特定的警告选项都有一个负的开始形式 -Wno- 关闭警告;例如, -Wno-implicit . 本手册仅列出两种格式中的一种,以非默认格式为准。

    对于你的情况,有问题的警告是 -Wformat

    -格式化
    检查对printf和scanf等的调用,以确保提供的参数具有与指定的格式字符串相匹配的类型,并且格式字符串中指定的转换是有意义的。这包括标准函数,以及由printf、scanf、strftime和strfmon(x/open扩展名,不在c标准中)族(或其他特定于目标的族)中的格式属性(请参见函数属性)指定的其他函数。在没有指定格式属性的情况下检查哪些函数取决于所选的标准版本,并且通过以下方式禁用对没有指定属性的函数的检查: -ffreestanding -fno-builtin .

    根据GNU libc版本2.2支持的格式功能检查格式。这些特性包括所有的iso c90和c99特性,以及来自单个Unix规范的特性,以及一些BSD和GNU扩展。其他库实现可能不支持所有这些特性;gcc不支持对超出特定库限制的特性发出警告。然而,如果 -pedantic 用于 -格式化 ,将对不在所选标准版本中的格式功能发出警告(但不适用于strfmon格式,因为这些格式不在任何C标准版本中)。请参见控制C方言的选项。

        2
  •  26
  •   dholbert    16 年前

    实际上,GCC手册确实提供了一种使用pragma实现这一点的方法。(与艾登·贝尔在另一个回答中所说的相反)

    http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

    例如,对于-wuninitialized警告,您可以执行…

    #pragma GCC diagnostic ignored "-Wuninitialized"
    

    …取消警告,或…

    #pragma GCC diagnostic warning "-Wuninitialized"
    

    …把它当作一个警告(而不是错误),即使你是用-werror构建的。

        3
  •  9
  •   shodanex    17 年前

    我使用了以下标志:

    -Wall -Wformat=0
    
        4
  •  2
  •   Aiden Bell    17 年前

    我想你在找

    #ifdef WIN32
    #pragma warning (disable: #num of the warning) 
    #endif
    

    在GCC中等效……

    您可以搜索选项,例如 -Wno转换-Wno格式安全性 在这里工作

    http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Warning-Options.html

    但就pragma指令而言:

    我引用了 来自谷歌的GCC邮件列表 :

    GCC目前没有提供您正在寻找的杂注工具。

    不要失去希望!有可行的 选择。

    修复代码的第一个最佳方法是 它不再发出警告。唉, 你说过你不能这样做。:

    注意:警告显示为 尽你的团队所能忍受的冗长! [见下文]

    忽略 不需要的警告是发布进程 将gcc输出到脚本(例如 一个Perl脚本)它去掉了 具体的、准确的警告 忽略。

    下一个忽略不想要的 警告是禁用警告 那个翻译单位。 -wno foozle mcgoogle,仅针对特定的翻译单元。那是一个 不过,强大的大锤。如果 警告位于头文件中,可能是 遍布你的整个 项目——我会指示你去的 后处理脚本解决方案 (假设你被禁止 修改代码)。

    所以目前没有,没有杂注指令来禁用特定的警告。你可以打开尽可能多的警告,而不是使用-wall。

    http://www.network-theory.co.uk/docs/gccintro/gccintro_31.html

    或修复代码