15

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

我尝试像这样禁用:

//do something
    return 0;

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

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

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

我正在使用 Visual Studio 2012 高级版...

任何帮助将不胜感激。

4

2 回答 2

26

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

MSDN 文档

对于 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
}
于 2012-09-12T04:15:23.213 回答
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 年 7 月 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 的当前状态压入堆栈,禁用下一行的指定警告,然后弹出警告堆栈,以便重置 pragma 状态。

以下代码语句说明了一个warning-number-list 参数可以包含多个警告号,并且可以在同一个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
}

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

Push 和 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 指令和 __Pragma 关键字

于 2020-03-26T14:37:55.167 回答