假設我有這樣 #define MY_MACRO(n) xxxxxxxxx // some code
使用在C反覆宏++
宏然後我想用它很多次類似
MY_MACRO(0)
MY_MACRO(1)
MY_MACRO(2)
MY_MACRO(3)
...
MY_MACRO(100)
是有這樣做的更好的辦法? (我必須使用宏)
假設我有這樣 #define MY_MACRO(n) xxxxxxxxx // some code
使用在C反覆宏++
宏然後我想用它很多次類似
MY_MACRO(0)
MY_MACRO(1)
MY_MACRO(2)
MY_MACRO(3)
...
MY_MACRO(100)
是有這樣做的更好的辦法? (我必須使用宏)
忘了所有受過高等教育的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次。
您可以使用迭代。您可以使用boost的預處理器庫或編寫自己的。後者祝你好運......它很複雜。預處理器元編程是棘手的業務。
使用升壓預處理器,你會做一些像這樣:
#define MY_MACRO_N(Z,N,D) MY_MACRO(N)
BOOST_PP_REPEAT(101, MY_MACRO_N, ~)
這很酷。我不知道'BOOST_PP_REPEAT'。聽起來非常有用 – valdo
你可以做這樣的事情:
int i;
for (i = 0; i <= 100; i++)
MY_MACRO(i);
通過使用這種循環MY_MACRO(n)
對子級調用101倍的電流值(0
至100
)。
+1,但是通過宏中的'//'我可以安全地將分號放在一個新行上。 –
也許他們在擁有'<='之前低估了。 –
如果開始傳遞給MY_MACRO的參數需要編譯時常量,則失敗。 –
是的,不要使用宏! –
爲什麼你認爲你需要使用宏,特別是在C++中有更好的選擇? –
編寫一個程序來創建宏調用。我會使用Python,它將大約3行代碼,但即使在C或C++中也不會那麼糟糕。 –