api特定typedef的目的是什么,例如GLsizei GLint GLvoid?

Loc*_*yer 7 c c++ opengl typedef

api特定typedef的目的是什么,例如GLsizei GLint GLvoid?

我在c和c ++代码中到处都看到了这一点.基本类型通常使用库前缀/后缀来表示.这背后的原因是什么?这是好习惯吗?我的程序应该自己做类似的事吗?

乍一看似乎使代码的可读性稍差.您必须立即将GLint转换为int,这就是一个简单的例子.

像UINT之类的东西对我来说更多,至少这会将unsigned int缩短为四个字母.

Ale*_*ski 3

这不是为了缩短名称,而是为了可移植性。不同的平台需要以不同的方式定义这些东西。

在 Std-C 中,long可能是 32 位或 64 位,具体取决于您的编译器/目标,因此不能安全地假定它具有特定大小。因此,库作者将根据目标平台的知识来定义自己的类型,保证一定的大小。

例如

#ifdef _WIN32
typedef __int64 INT64;  // long will not be 64 bit on Windows/VC.
#elif __GNU_C__
typedef long INT64;  // gcc typically uses 64 bit longs.
#elif // ... other platforms ...
...
#endif
Run Code Online (Sandbox Code Playgroud)

如果编译器在未来版本中更改类型属性,则可以在一处编辑类型。

过去,您也遇到过大小int可能为 16 或 32 位的典型情况,因此您不能int在需要DWORD-size 参数的代码中简单地使用原始类型。

这就是为什么你有像LPARAM和 之类的东西WPARAM

它也被用作一种抽象形式。这就是为什么你会看到像这样的 typedef

typedef int Handle;
Run Code Online (Sandbox Code Playgroud)

因为虽然它是intnow,但库作者保留稍后将其更改为其他任何内容的能力,例如 avoid *或他们认为必要的任何其他类型。

但客户端代码不需要知道它是int具体的,因为这正是它当前所发生的情况。客户端需要知道的就是将其传递给接受Handle类型的函数。

Typedef 还允许在编译时进行配置。例如,某些库可能有Real实数类型。它可以用如下方式定义

#ifdef USE_DOUBLE_PREC
typedef double Real;
#else
typedef float Real;
#endif
Run Code Online (Sandbox Code Playgroud)

库的用户可以/DUSE_DOUBLE_PREC在编译时选择设置以获得双精度浮点支持,但重要的是不需要更改库代码即可使其工作,因为它已经被抽象了。