2012-03-12 46 views
8

以下代码不禁止任何C4503编译器警告,但它确实会抑制C4244警告。是否可以禁用编译器警告C4503?

#pragma warning(push) 
#pragma warning(disable:4503) 
#pragma warning(disable:4244) 

#include <map> 
#include <string> 

int main(int argc, char *argv[]) 
{ 
    class Field; 
    typedef std::map<std::string, Field * > Screen; 
    typedef std::map<std::string, Screen> WebApp; 
    typedef std::map<std::string, WebApp> WebAppTest; 
    typedef std::map<std::string, WebAppTest> Hello; 
    Hello MyWAT; // The C4503 error is NOT suppressed 

    int a; 
    a = 5.0f; // The C4244 error is suppressed 
} 

#pragma warning(pop) 

请明确解释为什么C4503警告不会被抑制。注意:这可能是由于与How can I work around warning C4505 in third party libraries?中引用的类似原因。

有关更多相关信息,请参见thisthis

我在Windows 7机器上使用Visual Studio 2008。

+2

没有一些额外的上下文,你禁用警告,有点难以想出一个解决方案。我的猜测:你禁用围绕实例化怪物模板的代码的警告,但是你需要在定义了模板的头部之前禁用该警告。 – Xeo 2012-03-12 19:30:57

+0

@Xeo我再次检查并确认这不是问题。 – 2012-03-12 20:57:32

+0

您应该考虑解决这些警告,因为它们可能会导致问题,例如,链接时。 – PlasmaHH 2012-03-13 21:10:19

回答

3

从上下文不清楚,但也许你有太多#pragma陈述? MSDN说:

The compiler only supports up to 56 #pragma warning statements in a compiland. 
+0

我已经加倍检查并确认这不是问题。 – 2012-03-12 20:44:14

+2

然后我建议你提供一个最简单的例子。如果没有,我们没有机会猜测,这不是很令人满意。 – Matthias 2012-03-13 07:01:03

+1

我的问题已被编辑以提供该问题的可运行示例。 – 2012-03-13 20:55:05

2

有点怪怪的,但你可以通过删除#pragma warning(pop)使用确切的代码禁用此警告。我不明白为什么。

我应该说我在VS2010 C++ Express版本上。

+0

使用它在哪里? – PlasmaHH 2012-03-13 21:18:26

+1

我创建了一个新的CLR控制台应用程序,用上面的代码替换了projectname.cpp的内容,添加了“#include”stdafx.h“并编译完成,并且给了我很多警告。然后我评论了最终的'#pragma warning(pop)'并且没有警告。 – demoncodemonkey 2012-03-13 21:20:59

+0

我可以想象,产生这些警告的阶段是在所有类型的实例化和语义学的东西之后,在弹出窗口已经激活的地方。 – PlasmaHH 2012-03-13 21:24:39

1

也许说明明显,但您可以使用IDE设置完全删除此(和其他)警告,如解释here

这是我工作的唯一解决方案,并且在得知Boost启用了内置警告启用/禁用策略后修改了#pragma push/pop/enable/disable语句的行为,这是合理的。

+0

这也适用于禁用输出窗口中的警告文本。 – 2017-01-05 21:07:49