宏代

2016-09-23 59 views
2

我有如下所示,在那裏我有條目在表一中宏的情況:宏代

#define FOR_MY_TYPES(apply) \ 
    apply(a, b, c) \ 
    apply(d, e, f) \ 
    .... 

我也有一些預處理條件:

#define CONDITION1 1 
#define CONDITION2 0 

我希望根據這些條件添加表中的一些條目,如下所示:

#define FOR_MY_TYPES(apply) \ 
    apply(a, b, c) \ 
    #if CONDITION1 || CONDITION2 
    apply(x, y, z) 
    #endif 

實現此目的的最佳方法是隻保留一個宏定義,並且如果可能的話,根據條件避免重複條目。我想避免這種情況:

#if CONDITION1 
#define FOR_MY_TYPES(apply) \ 
    ....Full table here... 
#endif 
#if CONDITION2 
#define FOR_MY_TYPES(apply) \ 
//Full table again + CONDITION2 types 
#endif 
#if CONDITION1 || CONDITION2 
#define FOR_MY_TYPES(apply) \ 
//Full table again + CONDITION1 || CONDITION2 types 
#endif 

我的問題是,有相當多的組合,所以我應該儘量避免複製。它也更容易出錯。

+0

答案的號有一個問題問的最後一個星期左右的時間內這種情況下;這意味着可能還有其他更復雜的老問題。 –

+0

代替'apply(x,y,z)'具有'APPLY_12(x,y,z)',其中該宏定義在'#ifCONDITION1‖中CONDITION2' –

+0

嗯......我想到的問題是[在類似宏的宏中添加預處理器指令是錯誤的](http://stackoverflow.com/questions/39534609),但是場景略微不同 - 它是關於在參數列表中使用'#ifdef'宏調用的,而不是像這裏那樣在宏定義本身。我支持我的評論,直接回答是「不」。 (除此之外,反斜槓的問題仍然存在,或者不是宏定義的行。宏定義結束於何處?) –

回答

4

一個可行的方法:

#if CONDITION1 || CONDITION2 
#define really_apply(x) x 
#else 
#define really_apply(x) 
#endif 

#define FOR_MY_TYPES(apply) \ 
    apply(a, b, c) \ 
    really_apply(apply(x, y, z)) 
+0

工作正常。我仍然必須爲組合條件製作宏,但至少我可以保留一張表。我認爲沒有更好的辦法。 –