#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
最佳答案
关于此代码的第一件事要注意的是,它们实际上都不会被编译成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编译器不可用,则对64位单词(
unsigned __int64
)使用Microsoft特定的数据类型。否则,请使用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(同样,以字节为单位)。关于c++ - 谁能解释这个代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6567854/