gpt4 book ai didi

c - 通过硬编码地址制作指向结构的指针数组时避免 gcc 警告

转载 作者:太空宇宙 更新时间:2023-11-04 00:24:20 24 4
gpt4 key购买 nike

假设我有一个用作寄存器映射的结构。

typedef struct{
int reg1;
int reg2;
} regs;

我的寄存器有几个常量地址

# define ADDR1 0x60000000
# define ADDR2 0x70000000
# define ADDR3 0x80000000
# define ADDR4 0x90000000

为了让事情更容易循环,我想把它们放在一个数组中

regs * reg_list[4] = { ADDR1, ADDR2, ADDR3, ADDR4 };

当我用 gcc 和 -wAll 编译它时,我对数组中的每个元素都收到以下警告。我正试图摆脱这个警告。

warning: initialization makes pointer from integer without a cast

我可以将每个地址强制转换为 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 };

瞧 - 没有更多的警告。此外,以这种方式定义您的 ADDR 可以降低它们被滥用的可能性 - 您始终必须将它们用作指针。

注意:我在这里将它们定义为 volatile 以防止编译器跳过加载或存储,这对于必须与硬件寄存器接口(interface)的裸机应用程序非常关键。

关于c - 通过硬编码地址制作指向结构的指针数组时避免 gcc 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31769630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com