2011-07-04 103 views
2
#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 
+2

这段代码什么都不做!它实际上是 – Donotalo

+0

。在某处使用'WORD'的源代码中包含此代码。 –

+0

@tobias langner,我的意思是代码没有任何可执行语句。 :) – Donotalo

回答

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编译器不可用,则使用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(再次,大概以字节为单位)。

+0

“,并且GNU C编译器不可用”......这更多的是GNU C编译器不是编译代码的问题...... ;-)。无论如何,+1对于一个好的,耐心的解释。 –

5

这只是一个定义常量(又名定义),取决于#define EIGHT_BIT。

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

5

所有“代码”是否为所有“实时”代码设置了预处理器符号。如果在对此代码进行预处理之前定义了一个名为EIGHT_BIT的符号,则它会相应地设置WORDWORDLENGTH(尽管WORDLENGTH的值可疑),并且如果尚未定义EIGHT_BIT,它将设置不同的值。

+1

+1,指出对于一个'unsigned short'的WORD,WORDLENGTH 4是非常可疑的。 –

相关问题