为什么使用0xffffffff而不是-1?

时间:2019-05-06 19:54:34

标签: c++

我来自Java的背景,并开始了C ++图形编程的第一步。我研究了ogl-dev教程(http://ogldev.atspace.co.uk/),并注意到已定义了值为0xffffffff的宏。我知道它编码为-1,但是我不明白的是为什么我宁愿只写-1也不喜欢这种编码。是为了(向后)兼容性吗?它与C的某些特殊性有关吗?这是成语吗?

一个例子:

#define ERROR_VALUE 0xffffffff

随后

GLuint location = glGetUniformLocation(m_shaderProg, uniformName);
    if (location == ERROR_VALUE)
        throw new exception("error happened");

我为什么不写

if (location == -1)

或将我的宏定义为

#define ERROR_VALUE -1

谢谢:)

1 个答案:

答案 0 :(得分:3)

如果您检查the OpenGL specification(尤其是第134页的7.6节),则会发现实际上已指定glUniformLocation来返回GLint,这是一个32位带符号整数类型。调用glUniformLocation等效于对glGetProgramResourceLocation的调用,后者的返回类型也为GLint,并且被指定为在出错时返回值-1。通过替换location宏将0xFFFFFFFFERROR_VALUE进行比较在本教程代码中恰好起作用,因为locationGLuint而不是GLint。如果glUniformLocation实际上在那里返回-1,则-1首先将隐式转换为GLuint。由于-1是32位无符号整数类型,因此此隐式转换将遵循模运算,并且0xFFFFFFFF将绕回成为GLuint。如果location属于带符号类型,则将无法正常工作。正如Nicol Bolas所指出的那样,如果您想与某个常数进行比较以检查此功能是否成功,请将结果与GL_INVALID_INDEX进行比较,正是为了这个目的。与本教程代码中定义的宏相反,GL_INVALID_INDEX被指定为值为0xFFFFFFFF的无符号整数,由于存在usual arithmetic conversions…,这将导致任何比较都能正确进行。

正如其他人在上面的评论中也提到的那样,我不建议您考虑将这些教程中提供的代码视为良好的C ++的代表。使用宏来定义常量尤其无济于事(有关更多信息,请参见例如here)。我们通常也不会使用new来分配要抛出的异常对象,如下所示:

throw new exception("error happened");

通常,除非确实需要,否则您将避免在C ++中使用new(有关更多信息,请参见here)。而且,如果确实需要动态内存分配,则可以使用RAIIsmart pointers)来正确处理资源分配…