这是我的代码的一部分。
#define BASE_ADDR (0x41E00000)
#define UPPER_LIMIT 0X41E0FFFF
#define CONTROL_REG ((uint32_t *)(BASE_ADDR+0x60))
#define STATUS_REG ((uint32_t *)(BASE_ADDR+0x64))
#define DTR ((uint32_t *)(BASE_ADDR+0x68))
#define DRR (uint32_t *(BASE_ADDR+0x6C))
#define SLAVE_SEL ((uint32_t *)(BASE_ADDR+0x70))
它在BASE_ADDR定义语句中给出错误:
spicode.c:11:21: error: expected ‘)’ before numeric constant
#define BASE_ADDR (0x41E00000)
^
编辑:我的程序中的随机位置存在错误,因为在定义DRR时我没有将括号放在uint32_t上,也删除了其余的错误。
答案 0 :(得分:4)
问题在于DRR
。
更改如下:
#define DRR ((uint32_t *)(BASE_ADDR+0x6C))
如果像这样,选项-E
对于了解预处理器如何扩展宏非常有用。在这种情况下
使用clang -E
这是你得到的输出:
int main(){
uint32_t* a= (uint32_t *(0x41E00000 +0x6C));
return 0;
}
原始源代码为:
#define BASE_ADDR 0x41E00000
#define UPPER_LIMIT 0X41E0FFFF
#define CONTROL_REG ((uint32_t *)(BASE_ADDR+0x60))
#define STATUS_REG ((uint32_t *)(BASE_ADDR+0x64))
#define DTR ((uint32_t *)(BASE_ADDR+0x68))
#define DRR (uint32_t *(BASE_ADDR+0x6C))
#define SLAVE_SEL ((uint32_t *)(BASE_ADDR+0x70))
int main(){
uint32_t* a= DRR;
return 0;
}
现在很清楚为什么这段代码无法编译。
gcc
提供有关错误的信息性消息:
test.c:10:25: error: expected ‘)’ before numeric constant
#define BASE_ADDR 0x41E00000
^
test.c:15:25: note: in expansion of macro ‘BASE_ADDR’
#define DRR (uint32_t *(BASE_ADDR+0x6C))
clang
也做得很好:
test.c:20:15: error: expected ')'
uint32_t* a= DRR;
^
test.c:15:25: note: expanded from macro 'DRR'
#define DRR (uint32_t *(BASE_ADDR+0x6C))