这不是为了缩短名称,而是为了可移植性。不同的平台需要以不同的方式定义这些东西。
在 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)
因为虽然它是int
now,但库作者保留稍后将其更改为其他任何内容的能力,例如 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
在编译时选择设置以获得双精度浮点支持,但重要的是不需要更改库代码即可使其工作,因为它已经被抽象了。