使用 GLuint 而不是 unsigned int 有啥好处?
Posted
技术标签:
【中文标题】使用 GLuint 而不是 unsigned int 有啥好处?【英文标题】:What's the advantage of using GLuint instead of unsigned int?使用 GLuint 而不是 unsigned int 有什么好处? 【发布时间】:2012-01-19 20:37:20 【问题描述】:我希望尽可能地标准,那么当我可以使用原始类型时,为什么要“约束”我的类将其成员定义为 OpenGL 类型?有什么优势吗?
【问题讨论】:
【参考方案1】:“unsigned int”类型的大小取决于您构建的平台。我希望这通常是 32 位,但它可能是 16 位或 64 位(或其他 - 取决于平台)。
特定于库的类型通常被创建为根据特定于平台的规则进行类型定义。这允许通用应用程序使用正确的类型,而不必知道将要构建的平台。相反,特定于平台的知识被限制在单个通用头文件中。
【讨论】:
【参考方案2】:我认为在这种情况下并不重要,因为规范说它们是最小尺寸,而不是严格尺寸。看看 gl.h ~line 149 它们只是基本 C 类型的 typedef。它们只是一种方便——例如有一个布尔类型,所以如果你使用 C89 并且不使用任何布尔值,那么有一个设置供你与 GL 一起使用。 GLuint 只是输入 unsigned int 的一种更短的方式:
typedef unsigned int GLenum;
typedef unsigned char GLboolean;
typedef unsigned int GLbitfield;
typedef void GLvoid;
typedef signed char GLbyte; /* 1-byte signed */
typedef short GLshort; /* 2-byte signed */
typedef int GLint; /* 4-byte signed */
typedef unsigned char GLubyte; /* 1-byte unsigned */
typedef unsigned short GLushort; /* 2-byte unsigned */
typedef unsigned int GLuint; /* 4-byte unsigned */
typedef int GLsizei; /* 4-byte signed */
typedef float GLfloat; /* single precision float */
typedef float GLclampf; /* single precision float in [0,1] */
typedef double GLdouble; /* double precision float */
typedef double GLclampd; /* double precision float in [0,1] */
【讨论】:
在您的特定 OpenGL 实现上可能是这样,但是一旦您切换到unsigned int
不是 4 字节的平台,您的代码可能会停止工作。
嗯...我根本看不到任何尺寸保留。
检查spec (PDF)(表 2.2):例如 GLuint 需要至少 32 位大小,而 C++ unsigned int
根据 ISO C++ 只需要至少 16 位标准。规范特别指出了这一点:GL 类型不是 C 类型。因此,例如,GL 类型 int 在本文档之外称为 GLint,不一定等同于 C 类型 int。
这很有趣,但是 typedef 根本没有提供任何保护 - 这只是意味着如果您使用非常非常非常旧的计算机,它可能无法正常工作。您错过了报价正下方的部分,上面写着“不需要正确解释最小范围之外的整数值,但是”
不,typedef 是由您的平台提供的。在不同的平台上,您将使用不同的gl.h
,其 typedef 满足要求。 OpenGL 实现不能在平台之间移植。例如,您不能使用 Windows SDK 中的 gl.h
在 Linux 上进行编译。【参考方案3】:
更好的跨平台兼容性。
【讨论】:
【参考方案4】:这里已经提到了优点。但是,从以下示例中可以看出一个缺点:
class FileIn
public:
//Public interface like read
private:
void* handle;
;
上面的代码非常适合独立于平台的标头,但写作
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
class FileIn
public:
//Public interface like read
private:
HANDLE handle;
;
没有。
虽然前者需要像这样的丑陋类型转换
int fd=(int)( (size_t)handle );
close(fd);
我不知道任何具有sizeof(void*)
sizeof(int) 的系统。是的,如果 open 返回有效文件句柄的负数,它将失败。
对此有什么了解?避免在库包含文件中使用 typedef。即使 C 程序员需要编写struct
十几次,也要使用结构声明。在这里,一些 C 标准库实现都做错了。
对
在stdio.h
:
struct FILE;
在应用程序中:
struct FILE* the_file=fopen("filename.txt","rb");
/*...*/
错误
在stdio.h
:
typedef struct SOMENAMETHATNOONESHOULDUSE
/* Internal data members */
FILE;
在应用中
FILE* the_file=fopen("filename.txt","rb");
在编写 C++ 包装器时,这会强制 #include <cstdio>
或简单地声明句柄如上。
【讨论】:
这与 GLuint、OpenGL 类型或问题中的任何问题有什么关系?如果您打算回复另一个答案,则应将其作为评论,而不是作为答案。 @mah 这一般是关于 typedefs 的。所以它适用于不能预先声明的 GLuint。 这就是我的观点——它没有解决问题,因此发布“答案”是无效的。 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 @user877329 这似乎更像是 OpenGL 作者对他们使用 typedef 而不是解决问题的咆哮。以上是关于使用 GLuint 而不是 unsigned int 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C 和 C++ for 循环使用 int 而不是 unsigned int?
为什么int和而不是unsigned int用于C和C ++ for循环?
Mysql Query error: BIGINT UNSIGNED value is out of range in..解决方法
为什么c ++ STL使用unsigned in size()函数? [重复]
error:Assertion failed ((unsigned)i0 < (unsigned)size.p[0]) in cv::Mat::at