[英]How to evaluate a logical statement in a parameter of a macro
我有以下宏定義:
#define _mMRX0(xloc, yloc, code, data, supp, ref)
#define _mMRX1(xloc, yloc, code, data, supp, ref) (xloc), (yloc), (((code) + 0x80) & 0xFF), (((code) + 0x80) >> 8), (dDUMMYMRX), (supp), 0, (ref),
#define mMRX(cond, xloc, yloc, code, data, supp, ref) _mMRX##cond(xloc, yloc, code, data, supp, ref)
我想在以下來源上使用這些:
const unsigned char varb00[][8] = {
mMRX(0,25,22,12,0,0,27)
mMRX(1,25,22,12,0,0,27)
mMRX(1,1,29,12,0,0,21)
mMRX(1,1,36,12,0,0,22)
mMRX(1,25,22,1,0,0,27)
mMRX(1,1,29,1,0,0,21)
mMRX(1,1,36,2,0,0,22)
mMRX(((cfgSTORAGE)^1),24,8,1,0,0,3) // <- this is not yet working
mMRX(cfgSTORAGE,24,8,1,0,0,3) // <- this is not yet working
};
在編譯的第一步中,在配置文件cfgSTORAGE
定義為0或1。 配置文件中定義了大約25種不同的cfgXYZ
。 有時僅cfgXYZ
,有時與XOR一起使用。 所有這些都可能在第一個參數中用作條件。
在編譯過程中,第一個參數為0的文件將被忽略。 但是我對最后一行有疑問。
我想在頂部擴展宏,以便能夠在編譯之前處理這種情況((cfgSTORAGE)^1)
,因此,如果cfgSTORAGE
定義為1,則不會編譯最后一行。
我該怎么辦? (使用舊的Ansi-c編譯器,因此沒有可用的C ++ 11)
這個怎么樣:
#if cfgStorage
# define mMRX_CfgStorage _mMRX1
# define mMRX_NotCfgStorage _mMRX0
#else
# define mMRX_CfgStorage _mMRX0
# define mMRX_NotCfgStorage _mMRX1
#endif
const unsigned char varb00[][8] = {
mMRX(0,25,22,12,0,0,27)
mMRX(1,25,22,12,0,0,27)
mMRX(1,1,29,12,0,0,21)
mMRX(1,1,36,12,0,0,22)
mMRX(1,25,22,1,0,0,27)
mMRX(1,1,29,1,0,0,21)
mMRX(1,1,36,2,0,0,22)
mMRX_NotCfgStorage(24,8,1,0,0,3)
};
您可以嘗試通過多種方式實現自己的目標,但是您嘗試的方式並不是一個好方法
#define mMRX(cond, xloc, yloc, code, data, supp, ref) _mMRX##cond(xloc, yloc, code, data, supp, ref)
預處理程序將首先解析串聯運算符,導致_mMRXcond
; 用cond的實際值替換cond會在以后的階段(編譯時)發生,因為它是and傳入的參數
要獲得不同的行為,取決於cond的值,您可以編寫以下兩種行為:
#if cfgStorage
....
#else
....
#endif
或編寫多行宏
#define mMRX(cond, xloc, yloc, code, data, supp, ref) {\
if(cond)\
_mMRX1(xloc, yloc, code, data, supp, ref);\
else\
_mMRX0(xloc, yloc, code, data, supp, ref);\
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.