2013-11-14 48 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;