9a3*_*edi 1 c arrays embedded pointers gcc-warning
假设我有一个充当寄存器映射的结构.
typedef struct{
int reg1;
int reg2;
} regs;
Run Code Online (Sandbox Code Playgroud)
我的寄存器有一些常量地址
# define ADDR1 0x60000000
# define ADDR2 0x70000000
# define ADDR3 0x80000000
# define ADDR4 0x90000000
Run Code Online (Sandbox Code Playgroud)
为了让事情更容易循环,我想把它们放在一个数组中
regs * reg_list[4] = { ADDR1, ADDR2, ADDR3, ADDR4 };
Run Code Online (Sandbox Code Playgroud)
当我用gcc和-wAll编译它时,我得到了数组中每个元素的以下警告.我正试图摆脱这个警告.
warning: initialization makes pointer from integer without a cast
Run Code Online (Sandbox Code Playgroud)
我可以将每个单独的地址输入到reg*但这看起来非常冗长.有没有更好的办法?
由于常量地址是地址而不仅仅是整数,因此您应该将它们声明为volatile
指针:
#define ADDR1 ((volatile void *)0x60000000)
#define ADDR2 ((volatile void *)0x70000000)
#define ADDR3 ((volatile void *)0x80000000)
#define ADDR4 ((volatile void *)0x90000000)
typedef struct{
int reg1;
int reg2;
} regs;
volatile regs * reg_list[4] = { ADDR1, ADDR2, ADDR3, ADDR4 };
Run Code Online (Sandbox Code Playgroud)
Voila - 没有更多的警告.另外,ADDR
以这种方式定义它们会使它们不易被滥用 - 你总是必须使用它们作为指针.
注意:这里我定义它们是volatile
为了防止编译器跳过加载或存储,这对于必须与硬件寄存器接口的裸机应用程序来说非常关键.