C ++ / OpenGL:纹理到pixmap的例子 - 缩小转换错误

时间:2017-10-30 15:56:42

标签: c++ c++11 opengl type-conversion narrowing

我正在尝试从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或进行安全转换?

1 个答案:

答案 0 :(得分:2)

问题在于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)代替 GLX_DONT_CARE

来修复缩小问题
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
};

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