【问题标题】:disable warning c4702 seems not work for VS 2012禁用警告 c4702 似乎不适用于 VS 2012
【发布时间】:2012-09-12 02:53:28
【问题描述】:

我有一些测试代码,我预先添加了其余代码,因此在测试中永远无法达到其余部分。 由于我设置了 4 级警告,这会导致 c4702: unreachable-code 警告

我尝试这样禁用:

//do something
    return 0;

    /*-------------------------------------------------------------------------*/

#pragma warning(disable: 4702)
    //real code

但编译器仍在呻吟。而且因为我已将每个警告都视为错误,所以这不会编译...

我正在使用 Visual Studio 2012 Premium...

任何帮助将不胜感激。

【问题讨论】:

    标签: visual-studio warnings visual-studio-2012 compiler-warnings suppress-warnings


    【解决方案1】:

    您可能只需将 pragma 放在受影响函数的开始之前,而不是在其中。

    来自MSDN docs

    对于 4700-4999 范围内的警告编号,即与代码生成相关的警告编号,当编译器遇到函数的左大括号时有效的警告状态将对函数的其余部分有效.使用函数中的warning pragma来改变一个大于4699的警告的状态只会在函数结束后生效。

    例如:

    #pragma warning(push)
    #pragma warning(disable: 4702)
    bool Do() {
      return true;
      return true;  // No warning generated
    #pragma warning(pop)
    }
    
    bool DoDo() {
      return true;
      return true;  // Generates C4702
    }
    

    【讨论】:

    • 谢谢!这也适用于 Visual Studio 2010。
    • 同样适用于 Visual Studio 2013
    【解决方案2】:

    这来自 MSDN 文档 https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/2c8f766e(v=vs.110)?redirectedfrom=MSDN 也适用于 Visual Studio 2013(Express 版和 Pro 版)。

    文字:

    warning 07/11/2012 3 minutes to read 启用选择性修改编译器警告消息的行为。

    #pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...] ) 
    #pragma warning( push[ ,n ] ) 
    #pragma warning( pop )
    

    备注 以下警告说明符参数可用。

    表 1 警告说明符

    意义

    1、2、3、4

    将给定级别应用于指定的警告。这也会打开默认关闭的指定警告。

    默认

    将警告行为重置为其默认值。这也会打开默认关闭的指定警告。警告将在其默认的记录级别生成。

    有关详细信息,请参阅默认关闭的编译器警告。

    禁用

    不要发出指定的警告消息。

    错误

    将指定的警告报告为错误。

    一次

    只显示一次指定的消息。

    抑制

    将 pragma 的当前状态压入堆栈,禁用下一行的指定警告,然后弹出警告堆栈以重置 pragma 状态。

    以下代码语句说明了一个警告编号列表参数可以包含多个警告编号,并且可以在同一个 pragma 指令中指定多个警告说明符参数。

    #pragma warning( disable : 4507 34; once : 4385; error : 164 )
    

    这在功能上等同于以下代码。

    // Disable warning messages 4507 and 4034.
    #pragma warning( disable : 4507 34 )
    
    // Issue warning 4385 only once.
    #pragma warning( once : 4385 )
    
    // Report warning 4164 as an error.
    #pragma warning( error : 164 )
    

    编译器将 4000 添加到 0 到 999 之间的任何警告数。

    对于 4700-4999 范围内的警告编号,即与代码生成相关的警告编号,当编译器遇到函数的左大括号时有效的警告状态将对函数的其余部分有效.使用函数中的warning pragma 来改变一个数字大于4699 的警告的状态只会在函数结束后生效。以下示例显示了警告 pragma 的正确位置,以禁用代码生成警告消息,然后将其恢复。

    // pragma_warning.cpp
    // compile with: /W1
    #pragma warning(disable:4700)
    void Test() {
       int x;
       int y = x;   // no C4700 here
       #pragma warning(default:4700)   // C4700 enabled after Test ends
    }
    
    int main() {
       int x;
       int y = x;   // C4700
    }
    

    请注意,在整个函数体中,警告 pragma 的最后一个设置将对整个函数生效。

    Push and Pop 警告编译指示还支持以下语法。

    #pragma warning( push [ ,n ] )
    
    #pragma warning( pop )
    

    其中 n 表示警告级别(1 到 4)。

    pragma warning( push ) 存储每个警告的当前警告状态。 pragma warning(push, n) 存储每个警告的当前状态,并将全局警告级别设置为 n。

    pragma warning( pop ) 弹出最后一个压入堆栈的警告状态。您对 push 和 pop 之间的警告状态所做的任何更改都将撤消。考虑这个例子:

    #pragma warning( push )
    #pragma warning( disable : 4705 )
    #pragma warning( disable : 4706 )
    #pragma warning( disable : 4707 )
    // Some code
    #pragma warning( pop ) 
    

    在此代码的末尾,pop 将每个警告(包括 4705、4706 和 4707)的状态恢复到代码开头的状态。

    当您编写头文件时,您可以使用 push 和 pop 来保证用户所做的警告状态更改不会妨碍头文件的正确编译。在标题的开头使用 push 并在结尾使用 pop 。例如,如果您的头文件在警告级别 4 处编译不干净,则以下代码会将警告级别更改为 3,然后在头文件末尾恢复原始警告级别。

    #pragma warning( push, 3 )
    // Declarations/definitions
    #pragma warning( pop ) 
    

    有关有助于抑制警告的编译器选项的详细信息,请参阅 /FI 和 /w。

    另见参考 Pragma Directives 和 __Pragma 关键字

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 2020-04-04
      • 2023-04-06
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多