#ifndef EIGHT_BIT
#define THIRTYTWO_BIT // default 32 bit
#endif
#ifdef THIRTYTWO_BIT
#define WORD unsigned long
#define WORDLENGTH 4
#if defined(WIN32) && !defined(__GNUC__)
#define WORD64 unsigned __int64
#else
#define WORD64 unsigned long long
#endif
// THIRTYTWO_BIT
#endif
#ifdef EIGHT_BIT
#define WORD unsigned short
#define WORDLENGTH 4
// EIGHT_BIT
#endif
答案 0 :(得分:5)
它只是常量(也就是定义)的定义,取决于#define EIGHT_BIT。
如果定义了EIGHT_BIT,则WORD表示无符号短,WORDLENGTH为4.否则,WORD无符号长,WORDLENGTH也为4.此外,WORD64将被定义为无符号长long,除非您在WIN32系统上而不使用GCC
答案 1 :(得分:5)
所有“代码”都会为您拥有的任何“实时”代码设置预处理器符号。如果在预处理此代码之前定义了名为EIGHT_BIT
的符号,则相应地设置WORD
和WORDLENGTH
(尽管WORDLENGTH
的值是可疑的),并且它如果尚未定义EIGHT_BIT
,则会以不同方式设置值。
答案 2 :(得分:2)
关于这段代码的首要注意事项是它们实际上都不会编译成C.每个不是空格的行或注释都以井号(#
)开头,这意味着它们是预处理器指令。预处理程序指令在进入编译器之前更改代码。有关预处理程序指令的更多信息,请参阅this article。
现在我们知道了很多,让我们看看代码:
#ifndef EIGHT_BIT
#define THIRTYTWO_BIT // default 32 bit
#endif
如果未定义宏EIGHT_BIT
,请定义另一个名为THIRTYTWO_BIT
的宏。这很可能是指处理器上字中的位数。此代码旨在跨平台,这意味着它可以在多个处理器上运行。您发布的代码段适用于管理不同的字宽。
#ifdef THIRTYTWO_BIT
#define WORD unsigned long
#define WORDLENGTH 4
如果定义了宏THIRTYTWO_BIT
,则将WORD
定义为unsigned long
,其WORDLENGTH
为4(可能是字节)。请注意,此声明不一定正确,因为C标准仅保证long
至少与int
一样长。
#if defined(WIN32) && !defined(__GNUC__)
#define WORD64 unsigned __int64
#else
#define WORD64 unsigned long long
#endif
如果这是32位Windows平台且GNU C编译器不可用,则使用特定于Microsoft的数据类型表示64位字(unsigned __int64
)。否则,请使用GNU C数据类型(unsigned long long
)。
// THIRTYTWO_BIT
#endif
每个#if
和#ifdef
指令必须与相应的#endif
匹配,以描述条件部分的结束位置。此行结束之前发出的#ifdef THIRTYTWO_BIT
声明。
#ifdef EIGHT_BIT
#define WORD unsigned short
#define WORDLENGTH 4
// EIGHT_BIT
#endif
如果目标处理器的字宽为8位,则将WORD
定义为unsigned short
,并将WORDLENGTH
定义为4(再次,可能以字节为单位)