无法一致地禁用具有 #pragma 或项目警告级别的标头的 Visual Studio 2019 警告

Cannot consistently disable Visual Studio 2019 warnings for headers with #pragma or project warning level

提问人:Tom 提问时间:6/20/2021 最后编辑:Tom 更新时间:5/23/2022 访问量:327

问:

我正在将 SDL2/GLAD 和 stb_image.h 与 OpenGL 一起使用,但 AFAIK 我的问题与这一事实无关。我正在编辑所有配置下的属性,并且我没有使用预编译的标头。

我想将我的警告级别提高到 /W4 甚至 /Wall。但是,/Wall 给了我多达 1273 个错误,其中大部分来自数学库。因此,我将外部包含包装在 push/pop 指令中,但它似乎什么也没做。具体禁用警告也没有任何作用。glm#pragma#pragma warning(disable : n)

当我开始写这个问题时,无论我如何或在哪里放置我的 #pragma 指令(围绕标头、在标头内、围绕函数、围绕调用),或者我是否将项目警告级别设置为从 /W0 到 /W4 的任何位置,大约 80 个错误都会偷偷溜走:一个来自 SDL2,其余来自 .但是,在测试过程中,我的错误列表可能会在 ~7 个错误之间跳转,从备份到 70+。stb_image.hstb_image.h

我正在努力寻找 Visual Studio 处理错误的方式的任何一致性。我只想关闭来自外部标头和库的错误,这样我只能看到我编写的代码中的错误。我做错了什么?

#pragma warning(push, 0)
#include <glad/glad.h>
#include <SDL.h>

#define STB_IMAGE_IMPLEMENTATION
#include <stb_image/stb_image.h>

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#pragma warning(pop)

#include <iostream>
#include <vector>
#include <fstream>

// ...

Image LoadTexture(const std::string& path, GLenum format) {
    int width, height, channels;
    unsigned char* data = stbi_load(path.c_str(), &width, &height, &channels, STBI_default);

    GLuint texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    if (data) {
        glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);
    }
    else {
        std::cerr << "Failed to load texture " << path << std::endl;
        texture = -1; // error
    }

    stbi_image_free(data);
    return { texture, width, height, channels };
}

// ...
C++ Visual-Studio Visual-Studio-2019 警告杂

评论

0赞 Retired Ninja 6/20/2021
这应该有效。为了保持一致性,请确保始终测试完全相同的版本。先清理,然后构建或重建。我假设您没有使用基于示例的预编译标头。如果你是,你应该在问题中注意这一点。
0赞 Tom 6/20/2021
我没有使用预编译的标题,我会将其添加到帖子中。我正在清理和重建以刷新错误列表,在接近尾声时,当我变得更加沮丧时,我也重新启动了 VS。
0赞 Peter 6/20/2021
您可能需要检查您正在使用的库(glm 等)的标头,并查看它们是否具有受宏影响的内容,这些宏(例如)已在某些源文件中定义,但在其他源文件中未定义。对于库作者来说,有条件调试或检查代码的情况并不罕见,这些代码会根据定义的宏(例如,使用或与 Visual Studio 一起使用 - 这可能与你对此类编译指示的使用进行交互)以不同的方式调整编译器的警告。#pragma pushpop

答:

0赞 Pedro77 5/23/2022 #1

这可能是因为 IntelliSense,它似乎忽略了“#pragma 警告(push, 0)”

IntelliSense 非常不稳定(我们已经在 2022 年了!

为我解决了这个问题,是在列表框中选择“仅构建”,如下图所示:

Error list - Build Only