2013-11-14 49 views
0

我想定義的結構如何定義指向結構體的指針?

typedef struct 
{ 
    unsigned long GPFSEL[6]; 
    unsigned long Reserved_1; 
    unsigned long GPSET[2]; 
    unsigned long Reserved_2; 

//Ignoring the reserved and test bytes 
} GPIO_REGS_; 

一個解決方案是該

volatile GPIO_REGS_ * const GPIO_REGS = ((volatile GPIO_REGS_ *) 0x20200000UL); 

在這種情況下,我能達到寄存器如下:

GPIO_REGS->GPSET[0]; 

但是應該如何我定義了我可以使用的GPIO_REGS變量,如下所示

GPIO_REGS.GPSET[0]; 

爲什麼以下不起作用?

#define GPIO_REGS (*((GPIO_REGS_ *) 0x20200000UL)); 
+0

你爲什麼要這樣?''''''''''''或'(* GPIO_REGS).'? – clcto

+0

剛剛學習:) –

回答

1

在你的問題

#define GPIO_REGS (*((GPIO_REGS_ *) 0x20200000UL)); 

與代碼的問題是,在最後的分號。你應該將其刪除

#define GPIO_REGS (*((GPIO_REGS_ *) 0x20200000UL)) 

(真正的教訓是避免宏不惜一切代價。他們是出了名的棘手。你認爲你瞭解他們每一次,你只會得到安全的錯覺,然後更多的bug的代碼寫)

無論如何,你原來使用的宏:

GPIO_REGS.GPSET[0]; 

它擴展爲:

(*((GPIO_REGS_ *) 0x20200000UL));.GPSET[0]; 

看到分號不適合在這裏?

保持你的宏小。不要把;結束。並且總是將括號放在它們周圍。括號應該是最外層的東西 - 不要在末尾放一個分號。 (我們可以整天寫關於宏的其他警告

1
GPIO_REGS_ my_gpio_reg; 

GPIO_REGS_ * my_gpio_reg_ptr; 

my_gpio_reg_ptr = &my_gpio_reg;