我有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));
}
答案 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));
}