-1

我正在尝试将此纹理从 OpenGL 运行到像素图示例并得到以下错误

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 或进行安全转换?

4

1 回答 1

2

问题在GLX_DONT_CARE于其定义为:

#define GLX_DONT_CARE                     0xFFFFFFFF

因为这个值不适合 32-bit int,所以它的类型是unsigned int(见这个答案)。缩小转换的规则在 c++11 中确实发生了变化。

尝试将其隐式转换unsigned int为 anint会导致缩小转换警告。如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
};

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

于 2017-10-30T16:06:34.023 回答