将现有定义与后缀连接以在C中获取定义

时间:2014-12-15 09:40:46

标签: c macros concatenation c-preprocessor

我有2个定义:

#define REG1 (BASE_ADDR + REG1_OFFSET) //address
#define REG1_MASK 0x3f

我想通过宏生成一个命令,该命令将同时使用两个定义但仅作为变量给出REG1。例如,写下

WRITE_TO_REG(REG1)

将导致:

foo(REG1,0xa5a5a5a5,REG1_MASK)

为此,我创建了这些宏:

#define MASK_REG(REG) REG ## _MASK
#define FOO_REG(REG) foo(REG,0xa5a5a5a5,MASK_REG(REG))

但是我收到了一个错误(我在gcc中编译):粘贴")"和" _MASK"没有给出有效的预处理令牌。

我尝试了一些变体,包括:

#define MASK_REG(REG) MASK2_REG(REG)
#define MASK2_REG(REG) IDENTITY(REG) ## _MASK
#define IDENTITY(REG) REG

或:

#define PASTE2(x,y) PASTE(x,y)
#define PASTE(x,y) x ## y
#define MASK_REG(REG) PASTE2(REG,_MASK)

他们都没有奏效。任何想法?

添加完整代码:

#include <stdio.h>
#define REG1_BASE_ADDR 0x100
#define REG1_OFFSET 0x5
#define REG1 (REG1_BASE_ADDR + REG1_OFFSET) 
#define REG1_MASK 0x3f
#define PASTE2(x,y) PASTE(x,y)
#define PASTE(x,y) x ## y
#define MASK_REG(REG) REG ## _MASK
#define FOO_REG(REG) (REG + MASK_REG(REG))

int main() {
  printf("addr: %x, mask: %x, addr+mask: %x",REG1,REG1_MASK,FOO_REG(REG1));
}

1 个答案:

答案 0 :(得分:2)

好吧,我其实认为我明白了。

问题在于,在预处理器将粘贴到_MASK之前评估了宏REG1。 我似乎不需要更多的定义来执行粘贴:

#include <stdio.h>

#define REG1_BASE_ADDR 0x100
#define REG1_OFFSET 0x5
#define REG1 (REG1_BASE_ADDR + REG1_OFFSET) 
#define REG1_MASK 0x3f

#define FOO_REG(REG) (REG + REG##_MASK)

int main() {
  printf("addr: %x, mask: %x, addr+mask: %x",REG1,REG1_MASK,FOO_REG(REG1));
}