错误:在数字常量之前预期')'

时间:2017-08-01 13:45:14

标签: c

这是我的代码的一部分。

#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上,也删除了其余的错误。

1 个答案:

答案 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))