OpenGL规范规定'GLint'必须是32位宽,但gl.xml天真地将其定义为'int',而不是'int32\u t'。为什么?

OpenGL规范规定'GLint'必须是32位宽,但gl.xml天真地将其定义为'int',而不是'int32\u t'。为什么?,opengl,specifications,Opengl,Specifications,(glspec45.core.pdf)定义所有GL…类型的精确位宽度: 2.2.1状态设置命令的数据转换 … 一个实现必须准确地使用 表中表示GL类型的位。 但所谓的(gl.xml——官方的可解析OpenGLAPI规范),天真地将这些类型定义为对应C类型的别名 ... <type>typedef short <name>GLshort</name>;</type> <type>typedef int <name>GLint

(glspec45.core.pdf)定义所有
GL…
类型的精确位宽度:

2.2.1状态设置命令的数据转换 …
一个实现必须准确地使用 表中表示GL类型的位。

但所谓的(gl.xml——官方的可解析OpenGLAPI规范),天真地将这些类型定义为对应C类型的别名

...
<type>typedef short <name>GLshort</name>;</type>
<type>typedef int <name>GLint</name>;</type>
<type>typedef int <name>GLclampx</name>;</type>
...
。。。
typedef short GLshort;
typedef int闪烁;
typedef int GLclampx;
...
这可能是不安全的

为什么不使用固定宽度类型

为什么没有预处理器逻辑来确定正确的类型?为什么没有类型大小的编译时检查

更重要的是,在制作OpenGL函数/扩展加载程序时,我应该如何定义这些类型

这可能是不安全的

是的

那么

只要它实际上不是不安全的,只要您不尝试在不提供这些类型的预期大小的奇数球平台/编译器上运行此代码,就可以了。它适用于GCC、Clang、VC++和几乎所有其他主要编译器。这些定义适用于Windows、MacOS、Linux、Android、iOS以及许多其他系统和ABI

我理解了更强烈地坚持C和C++标准的愿望。但现实情况是,这些定义对于大多数实际使用的系统来说是合适的。对于不好的系统,由该系统的各个OpenGL提供程序为其提供替代定义

为什么不使用固定宽度类型

因为OpenGL在这些类型之前就已经存在了。记住:它们可以追溯到C99/C++11;OpenGL可以追溯到1992年

为什么没有类型大小的编译时检查

<>回到1992,C++甚至没有标准化。当时可能存在什么“编译时检查”?此外,OpenGL是用C定义的,C的编译时计算能力主要包括极端宏编程技术

更重要的是,在制作OpenGL函数/扩展加载程序时,我应该如何定义这些类型


除非您有特殊需要,否则请严格按照gl.xml所说的定义它们。

我知道这个问题已经得到了回答,但我想在
glew.h
文件中添加一些OpenGL类型是根据编译器版本或操作系统有条件地定义的

例如:

#如果定义(_MSC_VER)和&_MSC_VER<1400
typedef\uu int64闪烁64ext;
typedef unsigned_uuint64 GLuint64EXT;
#elif已定义(_MSC_VER)|已定义(uu BORLANDC_uuu)
typedef签名的长闪烁64ext;
typedef无符号长GLuint64EXT;
#否则
#如果定义了(uuu MINGW32_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
#包括
#恩迪夫
typedef int64_t GLint64EXT;
typedef uint64_t GLuint64EXT;
#恩迪夫

谢谢,这或多或少是我所期望的。顺便说一下,有一种方法可以在C中进行编译时检查@HolyBlackCat:这是(我在
编译器.h
中使用的,我几乎在每个项目中都使用),但在最新版本的C中也有一个
静态断言;它还不到10岁。自C99以来,固定大小的类型已经正式存在。@datenwolf:在XML格式之前,有.spec文件。他们有一长串的#ifdef供平台专门定义正确大小的整数。但它最终归结为同一件事。