2

抱歉标题令人困惑,但我想不出一个可以清楚地描述我的问题的标题。在编写 C 或 C++ 程序时,通常可以将 char 与 CHAR 或 int 与 INT 或 void 与 VOID 等关键字联系起来。

在 winnt.h 中,它们的定义如下:

#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#if !defined(MIDL_PASS)
typedef int INT;
#endif
#endif

这样做有什么用?是满足约定还是保证兼容性?

4

3 回答 3

3

我一直认为这些微不足道的 typedef(例如 int -> INT)更多的是关于一致性的。

我的意思是,Win32 中有许多大写的 typedef - DWORD、WORD、LPARAM、WPARAM、HANDLE、HWND,其中一些只是整数,它们的名称提供了它们使用的上下文,其中一些(例如 RECT 和 WNDCLASS)表示结构。

考虑函数 void f(int, BOOL, char, PAINTSTRUCT); 的情况 对我来说,允许所有大写字母更加一致:VOID f(INT, BOOL, CHAR, PAINTSTRUCT)。但这可能只是我。

于 2013-06-28T19:04:16.010 回答
1

如果我没记错的话,主要是约定。我认为 windows 将其中一些放在其中以确保某些数据类型的兼容性(例如,整数,保持 8 位、16 位、32 位等的兼容性)。

于 2013-06-28T18:07:44.947 回答
1

大写 (#defined) 版本通常用于使代码与各种编译器兼容。typedef 通常用于确保新命名的类型满足比编译器定义的原始类型更严格的规则。

通常,typedef int INT可以在检测编译器环境的块内看到 , 等,因此可以使用像“INT”这样的名称来提供比“int”更具限制性的语义。

在“C”中,所有原始类型,例如intand char,“至少”是某个大小(我现在不知道那个大小)。这意味着允许编译器使它们更大。我知道一个使用 32 位 char 类型的系统。这导致在做出假设时很容易编写不可移植的代码,例如假设“int”始终是 32 位。

在您的环境中进行实验可能会有所帮助。尝试如下的小程序,然后使用 32 位设置和 64 位设置编译并运行它:

int main (int argc, char **argv)
{
    printf("sizeof INT=%u\n", sizeof (INT));
    printf("sizeof int=%u\n", sizeof (int));
}

至于 VOID,将其定义为“void”有点奇怪。然而,它看起来 - 在给出的片段中 - 它被用来确定其他是否已经由同一个头文件定义 - 这是“C”中非常重要的一步,因为重复的 typedef 会导致错误。IIRC,重复定义可能导致错误或警告,取决于编译器和设置。

于 2013-06-28T18:39:08.410 回答