Мне нравится быть более стандартным, насколько это возможно, поэтому почему я должен "ограничивать" мои классы, определяя его как типы OpenGL, когда я могу использовать примитивные типы? Есть ли преимущества?
Какое преимущество использования GLuint вместо unsigned int?
Ответ 1
Тип "unsigned int" имеет другой размер в зависимости от платформы, на которой вы строите. Я ожидаю, что это обычно будет 32 бита, однако это может быть 16 или 64 (или что-то еще - в зависимости от платформы).
Типы, специфичные для библиотеки, часто создаются для typedef'd в соответствии с правилами конкретной платформы. Это позволяет универсальному приложению использовать правильный тип, не зная о платформе, для которой он будет создан. Вместо этого знания, специфичные для платформы, ограничены одним общим заголовочным файлом.
Ответ 2
Я не думаю, что это важно в этом случае, потому что спецификация говорит, что они минимальные размеры, а не строгие размеры. взгляните на gl.h ~ line 149 они всего лишь typedefs базовых типов C. они просто удобны - например, существует логический тип, поэтому, если вы используете 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] */
Ответ 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);
i не знаю никакой системы, которая имеет sizeof(void*)
< sizeof(int)
. Да, это будет неудачно, если open возвращает отрицательное число для допустимого дескриптора файла.
Что узнать об этом? Избегайте использования typedefs в библиотечных файлах. Вместо этого используйте объявления struct, даже если программистам C необходимо написать struct
десяток раз. Здесь некоторые реализации стандартной библиотеки C делают все это неправильным.
Right
В stdio.h
:
struct FILE;
И в приложении:
struct FILE* the_file=fopen("filename.txt","rb");
/*...*/
Wrong
В stdio.h
:
typedef struct SOMENAMETHATNOONESHOULDUSE
{
/* Internal data members */
} FILE;
В приложении
FILE* the_file=fopen("filename.txt","rb");
При написании оболочки С++ это заставляет либо #include <cstdio>
, либо просто объявить дескриптор, как указано выше.