禁用警告c4702似乎不适用于VS 2012

时间:2012-09-12 02:53:29

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

我有一些测试代码,我在前面添加了剩下的代码,所以其余的代码永远不会在测试中达到。 由于我设置了警告级别4,因此会产生c4702:无法访问代码警告

我试过像这样禁用:

//do something
    return 0;

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

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

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

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

任何帮助都会很高兴。

2 个答案:

答案 0 :(得分:20)

您可能只需要在受影响的函数开始之前放置编译指示而不是在其中。

来自MSDN docs

  

对于4700-4999范围内的警告编号(与代码生成相关的编号),编译器遇到函数的开括号时生效的警告状态将对函数的其余部分生效。使用函数中的警告编译指示来更改数字大于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
}

答案 1 :(得分:1)

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

文字:

警告2012年11月11日需阅读3分钟允许选择性地修改编译器警告消息的行为。

#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 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 )

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

对于与代码生成相关联的4700-4999范围内的警告编号,当编译器遇到某个函数的大括号时,该警告的状态将对该功能的其余部分生效。在函数中使用警告编译指示来更改数字大于4699的警告状态仅在函数结束后生效。下面的示例显示了正确的警告指示位置,以禁用代码生成警告消息,然后将其还原。

// 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
}

请注意,在整个功能主体中,警告编译指示的最后设置将对整个功能有效。

Push and Pop警告pragma还支持以下语法。

#pragma warning( push [ ,n ] )

#pragma warning( pop )

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

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

pragma warning(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并在结尾处弹出。例如,如果您的标头在警告级别4不能正常编译,则以下代码会将警告级别更改为3,然后在标头末尾恢复原始警告级别。

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

有关可帮助您消除警告的编译器选项的更多信息,请参见/ FI和/ w。

另请参见参考语法指令和__Pragma关键字