2016-05-17 72 views
1

我有一個頭文件的東西,如#如果用法:與枚舉

enum DataRate { 
    AB0, 
    AB1, 
    AB2, 
    ... 
}; 

,並在我的代碼我有事情喜歡

#define S_FACTOR AB0 

現在,函數調用像

foo(S_FACTOR); 

似乎工作正常,但條件彙編

#if ((S_FACTOR == AB0) || (S_FACTOR == AB2)) 

無法正常工作。

回答

5

預處理器對枚舉一無所知;它只是一個文本的操縱者。當您提供

#define S_FACTOR AB0 

你告訴預處理器與令牌AB0替代令牌S_FACTOR,而不是其他。

#if預處理器指令有點奇怪。它仍然只是文本替換,其目的是將其參數減少爲涉及整型常量的算術表達式。因此,它首先替換表達式中的所有已定義的宏。然後它將任何剩餘的標識符標記替換爲0,並嘗試評估表達式。

所以

#if ((S_FACTOR == AB0) || (S_FACTOR == AB2)) 

將首先被降低到

#if ((AB0 == AB0) || (AB0 == AB2)) 

因爲S_FACTOR是與替換列表宏。

然後,它取代所有識別符與0:

#if ((0 == 0) || (0 == 0)) 

這肯定的計算結果爲1(通常的C語義布爾值),因此#if的本體進行處理。但如果S_FACTOR已被定義爲AB1,那就完全一樣了。

有一個原因是預處理器被稱爲pre處理器。它在任何其他處理(包括聲明)之前完成其工作。

+0

好的,我明白了。如果我想用'#define'來設置條件編譯,除了'#define SNA'和'#define FOO'以外,還有其他的方案,以便我可以在後面執行簡單的邏輯(就像我已經做的那樣)? – mike65535

+0

嗯..現在似乎清楚我不使用枚舉! (我使用的枚舉是在.h文件中提供給我的,所以我必須提出一些東西)。 **謝謝!** – mike65535