任何人都可以解释我这段代码

时间:2011-07-04 06:06:14

标签: c++

#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

3 个答案:

答案 0 :(得分:5)

它只是常量(也就是定义)的定义,取决于#define EIGHT_BIT。

如果定义了EIGHT_BIT,则WORD表示无符号短,WORDLENGTH为4.否则,WORD无符号长,WORDLENGTH也为4.此外,WORD64将被定义为无符号长long,除非您在WIN32系统上而不使用GCC

答案 1 :(得分:5)

所有“代码”都会为您拥有的任何“实时”代码设置预处理器符号。如果在预处理此代码之前定义了名为EIGHT_BIT的符号,则相应地设置WORDWORDLENGTH(尽管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(再次,可能以字节为单位)