[英]Can anyone explain me this code
#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
它只是常量的定义(又名定义),具体取决于#define EIGHT_BIT。
如果定义了 EIGHT_BIT,WORD 表示 unsigned short,WORDLENGTH 为 4。否则,WORD 为 unsigned long,WORDLENGTH 也是 4。此外,WORD64 将被定义为 unsigned long long,除非您在 WIN32 系统上并且不使用 GCC。
所有“代码”都会为您拥有的任何“实时”代码设置预处理器符号。 如果在预处理此代码之前定义了名为EIGHT_BIT
的符号,它会相应地设置WORD
和WORDLENGTH
(尽管WORDLENGTH
的值是可疑的),如果尚未定义EIGHT_BIT
,它将以不同的方式设置值。
关于这段代码,首先要注意的是它实际上都不会被编译成 C。 不是空格或注释的每一行都以井号 ( #
) 开头,这意味着它们是预处理器指令。 预处理器指令甚至在将代码提交给编译器之前就对其进行了更改。 有关预处理器指令的更多信息,请参阅这篇文章。
现在我们知道了很多,让我们看一下代码:
#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 编译器不可用,则对 64 位字使用 Microsoft 特定的数据类型 ( 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(同样,大概以字节为单位)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.