我正在定義寄存器,用於使用GCC進行編譯的Tiva C系列啓動板。GCC宏1 + 1不等於2?
在頭文件中我有類似的代碼:
樣品A
#define GPIOB_BASE 0x40005000
#define GPIOB_AFSEL_R (*((unsigned long *) GPIOB_BASE + 0x420))
#define GPIOB_DEN_R (*((unsigned long *) GPIOB_BASE + 0x51C))
#define GPIOB_PCTL_R (*((unsigned long *) GPIOB_BASE + 0x52C))
要檢查它是否在做什麼,我認爲應該,我寫了這個小程序,它返回'10 '如預期。我繼續我的項目,並迅速遇到了嚴重的問題(寫入不可寫的地址)。
宏測試
#include <stdio.h>
#define BASE 0x9
#define BASE + PLUS_ONE 0x01
int main(void){
printf("%d", PLUS_ONE);
}
很多時間拉我的頭髮試圖調試後,我最終置換的地址與他們的硬編碼的等價物。
樣品B
#define GPIOB_BASE 0x40005000
#define GPIOB_AFSEL_R (*((unsigned long *) 0x40005420))
#define GPIOB_DEN_R (*((unsigned long *) 0x4000551C))
#define GPIOB_PCTL_R (*((unsigned long *) 0x4000552C))
和硬盤故障走了,事情就開始工作了!
有人可以幫我理解樣品A和之間的區別樣品B?
(是的,我應該更加關注生成的彙編代碼)
我希望這是一個錯字:'#define BASE + PLUS_ONE 0x01',你的意思是'#define PLUS_ONE BASE + 0x01'。 – 2014-10-29 12:22:18
是的 - 你的「宏觀測試」轉載是無稽之談,即使是一個完整的「工作」的例子,它也不會編譯,所以代碼的其餘部分實際上是你運行的是什麼? – 2014-10-29 12:36:14
總是用(和)包含所有的宏參數,否則你只會遇到你提到的那些問題。 – user3629249 2014-10-29 17:46:32