簡體   English   中英

如何評估宏參數中的邏輯語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM