特定于api的typedef(例如GLsizei GLint GLvoid)的目的是什么?

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

乍一看,似乎使代码的可读性降低了。您必须花点时间将GLint转换为头脑中的int,这是一个简单的示例。

对我来说,像UINT这样的东西可以带来更多 yield ,至少这将unsigned int缩短为四个字母。

最佳答案

这与缩短名称无关,而与可移植性有关。不同的平台将需要对这些内容进行不同的typedef。

在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

而且,如果编译器在将来的版本中更改类型属性,则可以在一处编辑这些类型。

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

因此,为什么要使用LPARAMWPARAM这样的东西。

它也被用作抽象形式。这就是为什么您会看到类似typedef的原因
typedef int Handle;

因为虽然现在是int,但库作者保留了稍后将其更改为其他任何功能的能力,例如void *或他们认为必要的任何其他类型。

但是客户端代码不需要特别知道它是int,因为这恰好是当前的情况。客户端需要知道的就是将其传递给接受Handle类型的函数。

Typedef还允许在编译时进行配置。例如。一些库可能具有用于实数的Real类型。可以用以下方式定义:
#ifdef USE_DOUBLE_PREC
typedef double Real;
#else
typedef float Real;
#endif

而且,库的用户可以选择在编译时设置/DUSE_DOUBLE_PREC以获得 double 浮点数支持,但是重要的是,由于已被抽象,因此无需更改库代码即可使其工作。

关于c++ - 特定于api的typedef(例如GLsizei GLint GLvoid)的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4237040/

10-12 17:25
查看更多