我有一个使用通常格式
定义的寄存器列表#define REG_NAME (*(volatile unsigned int *) 0x1000)
在我的代码中的某个地方,我想使用0x1000
在switch case
中获取REG_NAME
。
我该如何处理?
我尝试使用switch(®_NAME)
和switch(*REG_NAME)
但没有成功,它会抛出编译错误:
表达式必须具有整数类型
答案 0 :(得分:2)
你的宏必须这样定义:
#define REG_NAME (*(volatile unsigned int *) 0x1000)
然后您可以使用REG_NAME
来获取存储在寄存器中的值。如果您想将寄存器地址(此处为0x1000
值)作为整数(例如,int
),则必须使用(int) ®_NAME
。此处需要强制转换,因为®_NAME
是指针类型。
您如何定义宏是不正确的,因为强制转换操作符需要围绕类型名称的括号。
答案 1 :(得分:1)
这里,REG_NAME是一个解除引用的指针 - 即它是一个包含在寄存器中的值,应该在整个代码中对其进行处理。尝试将相同的定义用于多个目的(值和地址)最多会让人感到困惑!
你最好有以下几点:
#define REG_TYPE(x) (*(volatile unsigned int*)x)
#define REG_NAME_ADDR (0x1000)
#define REG_NAME REG_TYPE(REG_NAME_ADDR)
如果寄存器已在处理器制造商提供的头文件中定义,则您必须创建自己的定义来解决问题。