Подтвердить что ты не робот

Какое преимущество использования GLuint вместо unsigned int?

Мне нравится быть более стандартным, насколько это возможно, поэтому почему я должен "ограничивать" мои классы, определяя его как типы OpenGL, когда я могу использовать примитивные типы? Есть ли преимущества?

4b9b3361

Ответ 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>, либо просто объявить дескриптор, как указано выше.