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