2010-07-29 45 views
0

我有一個要求類似問題有關編譯時代碼生成

void doSomeThing(int x) 
{ 
..... 
} 

void fun() 
{ 

#ifdef XXXX_1_YYYY 
doSomeThing(XXXX_1_YYYY); 
#endif //XXXX_1_YYYY 

#ifdef XXXX_2_YYYY 
doSomeThing(XXXX_2_YYYY); 
#endif //XXXX_2_YYYY 

#ifdef XXXX_3_YYYY 
doSomeThing(XXXX_3_YYYY); 
#endif //XXXX_3_YYYY 

#ifdef XXXX_4_YYYY 
doSomeThing(XXXX_4_YYYY); 
#endif //XXXX_4_YYYY 

.... 
upto XXXX_20_YYYY 

} 

反正我有可以使用一些宏擴展技術或任何其他解決方案減少這種打字高達20?

宏定義可以是這樣的

#define XXXX_1_YYYY 10 
#define XXXX_2_YYYY 20 
#define XXXX_3_YYYY 30 
#define XXXX_4_YYYY 40 
... 
#define XXXX_20_YYYY 200 

每個#ifdef的不是相互排斥的。 代碼是在C++

+0

更多信息plz,你想要做什麼? – matt 2010-07-29 07:14:52

+0

這就是Boost的'c'版本嗎? – 2010-07-29 07:22:09

+0

@威爾迪恩:好的,也許這裏沒有c verison,但是你可能只是複製粘貼所有預處理器的東西......它的預處理器是相同的嗎?其次,這個問題的原始標籤只是'宏''模板'我要說些什麼,不知道爲什麼這個人改變了它......所以是的,我敢肯定他使用C++ – matt 2010-07-29 07:32:12

回答

0

也許是一個微不足道的答案,但如果它們都是互斥的,那麼使用#elif會爲您節省很多#endifs。

很難知道避免這種情況的好方法,而無需瞭解更多關於您實際正在嘗試做什麼的內容。所有這些函數都在同一個文件中,每個函數都有一個#if文件嗎?

0

我看不出用標準C預處理器做到這一點的方法。

也許問題可以重申。你能向我們展示更廣泛的背景嗎?請記住,不是濫用C預處理器,而是使用其他工具(例如m4,perl,bash等)或者JScript,VBScript等在Windows上生成代碼。如果你的構建系統允許,那就是。

0

如果存在XXXX_n_YYYY的特殊值(如指針值爲NULL,int爲-1​​等),則可以使用該特殊值將該常量標記爲「未定義」(而不是將其保留爲未定義)。然後你可以使用一些代碼,看起來像:

void fun() 
{ 
    size_t i; 
    static XYXX_type job_que[] = { XXXX_1_YYYY, XXXX_2_YYYY, .... }; 

    for (i=0; i!=ARRAY_SIZE(job_que); ++i) 
    { 
     if (job_que[i] != SPECIAL_VALUE) do_something(job_que[i]); 
    } 
} 

這是很難拿出一些與詳細的給量更好。

+0

I想要這個是編譯時間,而不是運行時間 – user405369 2010-07-29 07:36:07

+0

那樣的話,見上面的matt的註釋。你擁有的是你能達到的最好的。使用C++,可以使用do_something(void)重載空函數,並將未定義的函數定義爲無(避免錯誤),您可以在不使用if和數組的情況下執行相同的循環,但這是我能夠提出的最好的用。 – vhallac 2010-07-29 07:49:24