2017-08-01 51 views
-2

这是我的代码的一部分。错误:期望')'数字常量之前

#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) 
        ^

编辑:有,在我的程序随机的地方错误的,因为我没有放在括号aroung uint32_t的同时确定DRR,把这些括号也删除了其余的错误。

+6

你能告诉我们的代码的其他人呢?那不可能是问题。问题出在某个地方,你使用那个常数。根据经验,总是将#define常量放在parens中。 –

+1

该问题可能是由于您使用'BASE_ADDR'的另一部分代码造成的。 – Akira

+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)) 
+1

很好的答案。但问题是由于错字。这是无关紧要的。它可以很好地关闭和删除,让你的努力毫无用处, – StoryTeller

+1

GCC和Clang的现代版本显着改善了错误报告。仅凭这一点就值得升级。 –

+0

@JonathanLeffler你是对的。 icc(例如)错误有点模糊:错误:'期望表达式 \t uint32_t * a = DRR;' –

相关问题