通过硬编码地址创建指向结构的指针数组时避免gcc警告

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*但这看起来非常冗长.有没有更好的办法?

nne*_*neo 5

由于常量地址是地址而不仅仅是整数,因此您应该将它们声明为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为了防止编译器跳过加载或存储,这对于必须与硬件寄存器接口的裸机应用程序来说非常关键.