Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将现有的define与后缀连接起来,以获得C中的define_C_Macros_Concatenation_C Preprocessor - Fatal编程技术网

将现有的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));
}