2011-07-04 122 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是非常可疑的。 –

相關問題