使用GLuint而不是unsigned int有什么好处?

时间:2012-01-19 20:37:20

标签: c++ opengl

我喜欢尽可能更标准,所以当我可以使用原始类型时,为什么要“限制”我的类将其定义为OpenGL类型?有什么优势吗?

4 个答案:

答案 0 :(得分:47)

“unsigned int”类型具有不同的大小,具体取决于您正在构建的平台。我希望这通常是32位,但它可能是16或64(或其他东西 - 取决于平台)。

特定于库的类型通常根据特定于平台的规则创建为typedef。这允许通用应用程序使用正确的类型,而无需了解它将为其构建的平台。相反,特定于平台的知识被限制在单个公共头文件中。

答案 1 :(得分:3)

我认为在这种情况下并不重要,因为规格说它们是最小尺寸,而不是严格的尺寸。看看gl.h~第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] */

答案 2 :(得分:1)

更好的跨平台兼容性。

答案 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*)&lt; 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>或只是声明上面的句柄。