Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么C和C++;关键词#定义为;或;typedefed";作为他们的资本版本吗?_C++_C_Typedef_C Preprocessor - Fatal编程技术网

C++ 为什么C和C++;关键词#定义为;或;typedefed";作为他们的资本版本吗?

C++ 为什么C和C++;关键词#定义为;或;typedefed";作为他们的资本版本吗?,c++,c,typedef,c-preprocessor,C++,C,Typedef,C Preprocessor,很抱歉这个标题让人困惑,但我想不出一个标题能清楚地描述我的问题。在编写C或C++程序时,通常可以引用关键字,例如char与char,或者int int,或者虚空,On。p> 在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

很抱歉这个标题让人困惑,但我想不出一个标题能清楚地描述我的问题。在编写C或C++程序时,通常可以引用关键字,例如char与char,或者int int,或者虚空,On。p> 在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

这样做有什么用?它是为了满足惯例还是确保兼容性

如果我没弄错的话,大部分是惯例。我认为windows将它们中的一些放在它们的应用程序中,以确保某些数据类型(例如,整数,保持8位、16位、32位等的兼容性)的兼容性。

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

通常,在检测编译器环境的块中可以看到
typedef int int
,或类似的内容,因此可以使用“int”这样的名称来提供比“int”更严格的语义

在“C”中,所有的基本类型,如
int
char
,都“至少”有一定的大小(我现在不知道这个大小)。这意味着编译器可以使它们变大。我知道有一个系统使用32位字符类型。这使得在进行假设(例如假设“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,重复定义可能会导致错误或警告,取决于编译器和设置。

我一直认为这些琐碎的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)更为一致。但那可能就是我。

这叫“窗户怪异”。哈哈,好吧。因为有时函数被声明为返回空格,有时无效,所以我假设它是某种常规的副本-看到那里的可接受的答案……“当编写C或C++程序时,通常只能在Windows上(只有……),只有当你直接(或间接)<代码> WINNT。无论如何,我认为在“现代”程序中没有理由这么做。@OliCharlesworth似乎在链接中提到这一点的答案是不被接受的(尽管它拥有最多的投票权)。如果
INT
INT
是同一类型,那么它除了与其他所有caps类型名称保持一致之外没有任何用处。如果
INT
可能不是
INT
,那么这会让人非常困惑,可能是另一个名称(可能是
WORD
)这背后的原因实际上是16位/32位API之间的转换,其中内置的
int
过去是一个16位字,他们试图将int变成32位形式(MFC 1.1到MFC 2.0)@KeithThompson:
word
实际上命名了一个16位无符号类型,例如
std::uint16\u t
无符号短码
。还有
DWORD
,它是32位但没有符号。@MSalters:我认为
WORD
DWORD
是Microsoft特有的。我可以想象有人将
WORD
定义为32位无符号类型——尽管考虑到与Microsoft特定定义的冲突,这可能是个坏主意。