【问题标题】:#pragma warning is not suppressing a warning#pragma 警告不会抑制警告
【发布时间】:2011-12-28 03:18:39
【问题描述】:

我的一个 .cpp 文件正在生成警告 C4275,原因是第 3 方标头 I #include...(该警告是由于 DLL 导出类从非 DLL 导出类继承而触发的据我所知)。

我添加了一行:

#pragma warning(disable : 4275)

作为我的 .cpp 文件的第一行,但仍在生成警告。这是在 VC++ 2008 上,没有使用 PCH。

为什么我的#pragma 不起作用,以及(除了更改第 3 方代码)我该如何解决这个问题?

【问题讨论】:

  • 你有没有机会使用openmp?(我见过/使用过的唯一地方#pragma)

标签: c++ visual-c++ visual-studio-2008 c-preprocessor pragma


【解决方案1】:

我没有看到这个特定的警告,但是在 Visual Studio 中,您可以通过项目属性(即,不是编译指示)禁用特定的警告。以这种方式禁用它们似乎比通过编译指示禁用它们“更强大”。您可以只对您正在使用的一个文件执行此操作。

当然,警告经常告诉你一些有用的东西,所以这真的是最后的手段。

【讨论】:

  • 那也行不通。就我而言,我发现#includes 的杂耍使警告消失了——这一次——但我仍然想知道#pragma 在什么情况下不起作用。
【解决方案2】:

生成一个预处理文件,您可能会发现其他一些头文件重新启用了警告。

【讨论】:

  • 为了节省一些麻烦:在 Visual Studio 2005 和 2012 中,使用 /P 标志会导致警告编译指示被忽略,例如/P /D "NOMINMAX"#pragma warning(disable:4005) #define NOMINMAX 导致警告 C4005。
【解决方案3】:

如果有人在与我类似的情况下偶然发现:

如果您收到模板代码的警告,则需要在模板包含而不是使用它的代码之前禁用该警告。

例子:

// Disable the warning for size_t to int conversion which would cause a problem on 
// 64 bit systems if the first container had more than 2^32 elements. Disabling it 
// here is considered safe since it is impossible for the source container used in 
// this class ever have that many elements.
#pragma warning(disable : 4267)
#include <myLib/myTemplateDefs.h>
#pragma warning(default : 4267)

// Code which uses the template goes here

在我们的例子中,这是一个可接受的解决方案,因为容器涉及存储数据库表的列名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2019-10-22
    • 2014-12-19
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多