繁体   English   中英

谁能解释一下这段代码

[英]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的符号,它会相应地设置WORDWORDLENGTH (尽管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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM