我喜欢尽可能更标准,所以当我可以使用原始类型时,为什么要“限制”我的类将其定义为OpenGL类型?有什么优势吗?
答案 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>
或只是声明上面的句柄。