C++/OpenGL:纹理到像素图示例 - 缩小转换错误

C++ / OpenGL: Texture to pixmap example - narrowing conversion error

我正在尝试从 OpenGL 运行 这个 texture to pixmap example 并得到以下错误

tex_to_pix.cpp:40:1: error: narrowing conversion of ‘4294967295u’ from ‘unsigned int’ to ‘int’ inside { } [-Wnarrowing]

错误是指示例的以下代码块:

const int pixmap_config[] = {
    GLX_BIND_TO_TEXTURE_RGBA_EXT, True,
    GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
    GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT,
    GLX_DOUBLEBUFFER, False,
    GLX_Y_INVERTED_EXT, GLX_DONT_CARE,
    None
};

出现这个错误的原因是什么?

是编译器问题还是c++11问题?

有没有办法让我的编译器忽略 -Wnarrowing 或进行安全转换?

问题出在 GLX_DONT_CARE 上,它定义为:

#define GLX_DONT_CARE                     0xFFFFFFFF

因为这个值不适合 32 位 int,它的类型是 unsigned int(参见 this answer)。缩小转换的规则在 c++11 中确实发生了变化。

尝试将此 unsigned int 隐式转换为 int 会导致缩小转换警告。如 this answer 所示,缩小问题可以通过使用 static_cast(GLX_DONT_CARE & 0xFFFFFFFF) 而不是 [= 来解决32=]

const int pixmap_config[] = {
    GLX_BIND_TO_TEXTURE_RGBA_EXT, True,
    GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
    GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT,
    GLX_DOUBLEBUFFER, False,
    GLX_Y_INVERTED_EXT, static_cast<int>(GLX_DONT_CARE & 0xFFFFFFFF),
    None
};

或者,在您的编译器中禁用缩小转换错误(未指定)。