2010-05-26 74 views
0

我正在做一個大的C項目,我從來沒有遇到過這樣的情況,所以我需要你的建議。C預處理器:#define in C ...諮詢

您的意見是?是否可以在條件預處理程序中定義常量,如我在下面所做的那樣,或者您建議我以其他方式執行此操作?

#define NUM_OCTAVES_4 
//#define NUM_OCTAVES_5 

    #ifdef NUM_OCTAVES_4 
    #define OCTAVES 4 
    const unsigned char borders [4] = {11, 26, 50, 98}; 
    #elif NUM_OCTAVES_5 
    #define OCTAVES 5 
    const unsigned char borders [5] = {11, 26, 50, 98, 194}; 
    #endif 

如果我這樣做,有什麼缺點嗎?

回答

4
#define OCTAVES 4 

#if OCTAVES == 4 
const unsigned char borders [4] = {11, 26, 50, 98}; 
#elif OCTAVES == 5 
const unsigned char borders [5] = {11, 26, 50, 98, 194}; 
#endif 
+0

如果更改爲'const的無符號字符邊界[八度] ='每個然後它會更酷了。 – nategoose 2010-05-26 16:43:42

1

當然可以。這是條件編譯的要點。

1

是八度4/5如此fundemental,你會編譯不同版本的應用程序? 如果您銷售它會是一個不同的產品?

正確的方法是在運行時用malloc分配邊界,但如果這只是一個簡單的練習,那麼migth不想了解這一點。

或者您可以製作邊框[5]並將最後一個值設置爲0或一些容易檢測到的八度音階結束值。

1

爲什麼不只是有「5」版本的陣列,然後有 int noctaves = 4;或其他方式忽略最後一個八度,如果你只想要4?

1

DRY,即少重複,是有點更聰明:

#define OCTAVES 4 
/*define OCTAVES 5 */ 

const unsigned char borders [] = {11, 26, 50, 98, 
#if OCTAVES == 5 
    194 
#endif 
}; 

這樣,你不需要四個第一值相同的代碼的兩個「分支」 。

或者,如果你發現攻擊性,因數它變成一個宏觀和重複,而是:

#define BORDERS4 11, 26, 50, 98 

#if OCTAVES == 4 
const unsigned char borders[] = { BORDERS4 }; 
#else if OCTAVES == 5 
const unsigned char borders[] = { BORDERS4, 198 }; 
#endif 
+0

但是,它更醜。 – SLaks 2010-05-26 15:08:18

+0

'#else if'應該是'#elif'。 – Jens 2011-09-02 17:27:54