我来自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
谢谢:)
答案 0 :(得分:3)
如果您检查the OpenGL specification(尤其是第134页的7.6节),则会发现实际上已指定glUniformLocation
来返回GLint
,这是一个32位带符号整数类型。调用glUniformLocation
等效于对glGetProgramResourceLocation
的调用,后者的返回类型也为GLint
,并且被指定为在出错时返回值-1
。通过替换location
宏将0xFFFFFFFF
与ERROR_VALUE
进行比较在本教程代码中恰好起作用,因为location
是GLuint
而不是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)。而且,如果确实需要动态内存分配,则可以使用RAII(smart pointers)来正确处理资源分配…