2012-11-26 86 views
4

我已經寫類似如下:預處理語句問

#define ABC20 
//#define ABC10 
//#define ABC00 

#ifdef ABC20 
    #define SYSTEMNAME      "ABC2" 
#elif ABC10 
    #define SYSTEMNAME      "ABC1" 
#elif ABC00 
    #define SYSTEMNAME      "ABC0" 
#else 
    #define SYSTEMNAME      "UNKNOWN" 
#endif 

而且它可以工作。

但如果我更改爲以下:

//#define ABC20 
#define ABC10 
//#define ABC00 

#ifdef ABC20 
    #define SYSTEMNAME      "ABC2" 
#elif ABC10 
    #define SYSTEMNAME      "ABC1" 
#elif ABC00 
    #define SYSTEMNAME      "ABC0" 
#else 
    #define SYSTEMNAME      "UNKNOWN" 
#endif 

當我編譯,它得到了錯誤說ABC10未聲明。你們知道爲什麼嗎?

回答

4

使用已定義的測試:

#ifdef ABC20 
    #define SYSTEMNAME      "ABC2" 
#elif defined ABC10 
    #define SYSTEMNAME      "ABC1" 
#elif defined ABC00 
    #define SYSTEMNAME      "ABC0" 
#else 
    #define SYSTEMNAME      "UNKNOWN" 
#endif 

否則是沒有條件的elif來檢查,因爲後加工前你留下了:

#ifdef 
  #define  SYSTEMNAME                       "ABC2" 
#elif 
  #define  SYSTEMNAME                       "ABC1" 
#elif 
  #define  SYSTEMNAME                       "ABC0" 
#else 
  #define  SYSTEMNAME                       "UNKNOWN" 
#endif 

但只是在defined替換試驗用結果如此得到:

#if 0 
    #define SYSTEMNAME      "ABC2" 
#elif 1 
    #define SYSTEMNAME      "ABC1" 
#elif 0 
    #define SYSTEMNAME      "ABC0" 
#else 
    #define SYSTEMNAME      "UNKNOWN" 
#endif 

或者,您可以定義在與true值,標誌的休息與假值標誌,而不改變測試:

#define ABC20 0 
#define ABC10 1 
#define ABC00 0 
+1

你能解釋更多@perreal?我不明白。 TQ。 – Coolguy

+0

我的ABC2 @perreal在哪裏? – Coolguy

+0

這就像在C中說else else()一樣。你需要一個條件來檢查。您也可以將ABC10定義爲1以使其工作 – perreal

0

這基本上是因爲已經給出了相同的答案,但我嘗試從不同的天使解釋。

指令#elif#if的「else if」變體。該指令接受一個表達式並檢查該值是否爲真(即非零)。在這種情況下,表達式中使用的任何變量都應該存在。 (不可否認,C標準認爲任何未定義的符號都應該被視爲值爲0--然而,依賴於這一點被認爲是非常糟糕的做法。)

在您的情況下,您正在尋找與「#ifdef」相對應的「else if」變體。

#ifdef ABC20 
#define SYSTEMNAME      "ABC2" 
#elif defined(ABC10) 
#define SYSTEMNAME      "ABC1" 
... 

括號defined後是可選的,但使代碼更容易包含在讀:這是如下編寫的。

0

在你的第一個例子中,你定義了值...沒有任何東西...你只能創建它們的定義。 因此,第一個

#ifdef ABC20 

工作...作爲ABC20被定義。

然而,當你註釋掉該行和ABC20不再定義,你到達

#elif 

這種說法不評估值是否被定義,但看測試的定義本身.. 。這不存在。

試試這個

//#define ABC20 1 
    #define ABC10 1 
    //#define ABC00 1