2009-05-06 68 views
3

將宏名稱作爲其他宏的參數來模擬高階函數是否「安全」?宏(高階)可以做多少?

I.e.我應該在哪裏尋找不要在自己的腳下拍自己?

下面是一些片段:

#define foreach_even(ii, instr) for(int ii = 0; ii < 100; ii += 2) { instr; } 
#define foreach_odd(ii, instr) for(int ii = 1; ii < 100; ii += 2) { instr; } 

#define sum(foreach_loop, accu) \ 
    foreach_loop(ii, {accu += ii}); 

int acc = 0; 
sum(foreach_even, acc); 
sum(foreach_odd, acc); 

什麼部分應用程序,我能做到嗎? :

#define foreach(ii, start, end, step, instr) \ 
    for(int ii = start; ii < end; ii += step) { instr; } 

#define foreach_even(ii, instr) foreach(ii, 0, 100, instr) 
#define foreach_odd(ii, instr) foreach(ii, 1, 100, instr) 

#define sum(foreach_loop, accu) \ 
    foreach_loop(ii, {accu += ii}); 

int acc = 0; 
sum(foreach_even, acc); 
sum(foreach_odd, acc); 

我可以在宏裏面定義一個宏嗎?

#define apply_first(new_macro, macro, arg) #define new_macro(x) macro(arg,x) 

回答

3

如果您希望儘可能使用預處理器,您可能需要嘗試boost.preprocessor

但請注意,它是不安全這樣做。例如,逗號使用預處理器會導致很多問題。不要忘記,預處理器不理解(或者甚至試圖理解)它們生成的任何代碼。

我的基本建議是「不要這樣做」,或者「儘可能小心謹慎」。

1

我已經在c-preprocessor中完全實現了一個爛的小單元測試框架。幾十個宏,大量的宏是另一個宏類型的東西的一個參數。

這種事情是而不是在這個詞的最佳實踐意義上的「安全」。有一些微妙而非常有力的方法可以在腳下自我射擊。單元測試項目是一個失控的玩具。

不知道您是否可以嵌套宏定義。我懷疑這一點,但我會去試試...... GCC不喜歡它,並與

nested_macro.cc:8: error: stray '#' in program
nested_macro.cc:3: error: expected constructor, destructor, or type conversion before '(' token
nested_macro.cc:3: error: expected declaration before '}' token

自插頭迴應:如果你有興趣的單元測試框架可以在https://sourceforge.net/projects/dut/

找到