我有一些宏可以很容易地定义寄存器中的位字段(我使用这些宏进行读、修改、写操作、设置、获取等)。我得到一个编译错误,我不明白。

// used just for named arguments -- to make the values more clear when defined
#define FLDARGS(dwOffset, bitStart, bitLen) dwOffset, bitStart, bitLen
// extract just the dwOffset part
#define FLD_DWOFFSET(dwOffset, bitStart, bitLen) dwOffset

// define a bit field
#define CFGCAP_DEVCTRL FLDARGS(2, 16, 4)

// in a function:

uint32_t dwAddr = addr/4;
// compare just the dwOffset part
if(dwAddr == FLD_DWOFFSET( CFGCAP_DEVCTRL ))
{
 // do something
}

我原以为这会扩展成:
CFGCAP_DEVCTRL=2、16、4
FLD_DWOFFSET(CFGCAP_DEVCTRL)=2
我得到gcc错误:
error: macro "FLD_DWOFFSET" requires 3 arguments, but only 1 given
      if(dwAddr == FLD_DWOFFSET( CFGCAP_DEVCTRL ))
                                                ^
error: ‘FLD_DWOFFSET’ was not declared in this scope
      if(dwAddr == FLD_DWOFFSET( CFGCAP_DEVCTRL ))

有什么帮助吗?谢谢。

最佳答案

让我们看看如何处理宏:

if(dwAddr == FLD_DWOFFSET( CFGCAP_DEVCTRL ))

首先,它尝试替换最外层的宏FLD_DWOFFSET。但它需要3个参数,而您只需提供1(此时尚未解析内部宏)。预处理器无法继续,因此出现错误。
这里有更多相关信息:http://gcc.gnu.org/onlinedocs/cpp/Macro-Pitfalls.html#Macro-Pitfalls

09-11 17:33