2012-05-10 54 views
3

假設我有這樣 #define MY_MACRO(n) xxxxxxxxx // some code使用在C反覆宏++

宏然後我想用它很多次類似

MY_MACRO(0) 
MY_MACRO(1) 
MY_MACRO(2) 
MY_MACRO(3) 
... 
MY_MACRO(100) 

是有這樣做的更好的辦法? (我必須使用宏)

+7

是的,不要使用宏! –

+1

爲什麼你認爲你需要使用宏,特別是在C++中有更好的選擇? –

+1

編寫一個程序來創建宏調用。我會使用Python,它將大約3行代碼,但即使在C或C++中也不會那麼糟糕。 –

回答

0

忘了所有受過高等教育的teoreticians評論家們只是說永遠不會 - 永遠敢於使用宏!

宏確實是必要的邪惡。是的,有時候還有其他選項,比如模板,多態等等。但並不總是它可能擺脫重複沒有宏的用戶。

而且,就我的愚見而言,宏是比無數次重寫相同的東西更好的選擇。

現在關於你的問題。如果你的宏的計算結果是一個表達式,其參數可能是一個運行時參數 - 你可以使用一個循環。

如果你的宏需要一個已知的編譯時間 - 你可以考慮使用模板(如果適用)。

如果您的宏需要表達式這是一個數值常數 - 沒有替代方案。

所有我可以建議是不是實際上重複宏100倍,你可能會做一些花樣,比如下面:

#define MACRO_IX10(m, i) \ 
    m(i##0) \ 
    m(i##1) \ 
    m(i##2) \ 
    m(i##3) \ 
    m(i##4) \ 
    m(i##5) \ 
    m(i##6) \ 
    m(i##7) \ 
    m(i##8) \ 
    m(i##9) 

#define MACRO_IX100(m) \ 
    MACRO_IX10(m,) \ 
    MACRO_IX10(m, 1) \ 
    MACRO_IX10(m, 2) \ 
    MACRO_IX10(m, 3) \ 
    MACRO_IX10(m, 4) \ 
    MACRO_IX10(m, 5) \ 
    MACRO_IX10(m, 6) \ 
    MACRO_IX10(m, 7) \ 
    MACRO_IX10(m, 8) \ 
    MACRO_IX10(m, 9) 

然後,你可以這樣做:

MACRO_IX100(MYMACRO) 

這相當於用適當的表達式調用你的宏100次。

6

您可以使用迭代。您可以使用boost的預處理器庫或編寫自己的。後者祝你好運......它很複雜。預處理器元編程是棘手的業務。

使用升壓預處理器,你會做一些像這樣:

#define MY_MACRO_N(Z,N,D) MY_MACRO(N) 

BOOST_PP_REPEAT(101, MY_MACRO_N, ~) 
+0

這很酷。我不知道'BOOST_PP_REPEAT'。聽起來非常有用 – valdo

1

你可以做這樣的事情:

int i; 
for (i = 0; i <= 100; i++) 
    MY_MACRO(i); 

通過使用這種循環MY_MACRO(n)對子級調用101倍的電流值(0100)。

+0

+1,但是通過宏中的'//'我可以安全地將分號放在一個新行上。 –

+0

也許他們在擁有'<='之前低估了。 –

+2

如果開始傳遞給MY_MACRO的參數需要編譯時常量,則失敗。 –