【发布时间】:2012-01-19 20:37:20
【问题描述】:
我希望尽可能地标准,那么当我可以使用原始类型时,为什么要“约束”我的类将其成员定义为 OpenGL 类型?有什么优势吗?
【问题讨论】:
我希望尽可能地标准,那么当我可以使用原始类型时,为什么要“约束”我的类将其成员定义为 OpenGL 类型?有什么优势吗?
【问题讨论】:
“unsigned int”类型的大小取决于您构建的平台。我希望这通常是 32 位,但它可能是 16 位或 64 位(或其他 - 取决于平台)。
特定于库的类型通常被创建为根据特定于平台的规则进行类型定义。这允许通用应用程序使用正确的类型,而不必知道将要构建的平台。相反,特定于平台的知识被限制在单个通用头文件中。
【讨论】:
我认为在这种情况下并不重要,因为规范说它们是最小尺寸,而不是严格尺寸。看看 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] */
【讨论】:
unsigned int 不是 4 字节的平台,您的代码可能会停止工作。
unsigned int 根据 ISO C++ 只需要至少 16 位标准。规范特别指出了这一点:GL 类型不是 C 类型。因此,例如,GL 类型 int 在本文档之外称为 GLint,不一定等同于 C 类型 int。
gl.h,其 typedef 满足要求。 OpenGL 实现不能在平台之间移植。例如,您不能使用 Windows SDK 中的 gl.h 在 Linux 上进行编译。
更好的跨平台兼容性。
【讨论】:
这里已经提到了优点。但是,从以下示例中可以看出一个缺点:
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> 或简单地声明句柄如上。
【讨论】: