В чем преимущество использования GLuint вместо unsigned int? - PullRequest
28 голосов
/ 20 января 2012

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

Ответы [ 4 ]

47 голосов
/ 20 января 2012

Тип "unsigned int" имеет разный размер в зависимости от платформы, на которой вы строите.Я ожидаю, что это обычно будет 32 бита, однако это может быть 16 или 64 (или что-то еще - в зависимости от платформы).

Библиотечные типы часто создаются для определения типа в соответствии сконкретные правила.Это позволяет универсальному приложению использовать правильный тип без необходимости знать платформу, для которой оно будет создано.Вместо этого знание платформы ограничено одним общим заголовочным файлом.

3 голосов
/ 11 ноября 2013

Я не думаю, что это имеет значение в этом случае, потому что спецификация говорит, что они минимальные размеры, а не строгие размеры. взгляните на gl.h ~ строка 149 это просто определения типов базовых Си. они просто удобны - например, есть логический тип, поэтому, если вы используете 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] */
1 голос
/ 20 января 2012

Лучшая кроссплатформенная совместимость.

0 голосов
/ 30 июля 2014

Преимущества уже упоминались здесь. Тем не менее, из следующих примеров есть недостаток:

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*) <<code>sizeof(int). Да, произойдет сбой, если open вернет отрицательное число для правильного дескриптора файла.

Что узнать об этом? Избегайте использования typedefs в библиотеках включаемых файлов. Вместо этого используйте объявления структуры, даже если программистам на С нужно написать 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>, либо просто объявляет дескриптор, как указано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...