将现有的define与后缀连接起来,以获得C中的define
我有两个定义:将现有的define与后缀连接起来,以获得C中的define,c,macros,concatenation,c-preprocessor,C,Macros,Concatenation,C Preprocessor,我有两个定义: #define REG1 (BASE_ADDR + REG1_OFFSET) //address #define REG1_MASK 0x3f 我想通过宏生成一个命令,该宏将使用这两个定义,但只将giving作为变量REG1。比如写 WRITE_TO_REG(REG1) 将导致: foo(REG1,0xa5a5a5a5,REG1_MASK) 为此,我创建了以下宏: #define MASK_REG(REG) REG ## _MASK #define FOO_REG(REG)
#define REG1 (BASE_ADDR + REG1_OFFSET) //address
#define REG1_MASK 0x3f
我想通过宏生成一个命令,该宏将使用这两个定义,但只将giving作为变量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中编译):粘贴“)”和“\u MASK”没有给出有效的预处理令牌
我尝试了一些变化,包括:
#define MASK_REG(REG) MASK2_REG(REG)
#define MASK2_REG(REG) IDENTITY(REG) ## _MASK
#define IDENTITY(REG) REG
或:
他们都没有工作。有什么想法吗
添加完整的代码:
#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));
}
#包括
#定义REG1\u BASE\u ADDR 0x100
#定义REG1\u偏移量0x5
#定义REG1(REG1\u BASE\u ADDR+REG1\u OFFSET)
#定义REG1_掩码0x3f
#定义粘贴2(x,y)粘贴(x,y)
#定义粘贴(x,y)x##y
#定义掩码_REG(REG)REG####u掩码
#定义FOO_REG(REG)(REG+掩码_REG(REG))
int main(){
printf(“地址:%x,掩码:%x,地址+掩码:%x”,REG1,REG1_掩码,FOO_REG(REG1));
}
好的,我想我真的明白了
问题是宏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));
}
#包括
#定义REG1\u BASE\u ADDR 0x100
#定义REG1\u偏移量0x5
#定义REG1(REG1\u BASE\u ADDR+REG1\u OFFSET)
#定义REG1_掩码0x3f
#定义FOO#u REG(REG)(REG+REG####u掩码)
int main(){
printf(“地址:%x,掩码:%x,地址+掩码:%x”,REG1,REG1_掩码,FOO_REG(REG1));
}
尝试删除##
如何调用宏函数?定义本身不应该是个问题。例如:FOO_REG(REG1)在我看来,问题是在预处理器尝试粘贴宏之前,REG1被计算为(BASE_ADDR+REG1_OFFSET)。是的,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));
}