此C/C 的结构初始化器如何使用足够的字段工作

How does this C/C++ struct initializer with not enough fields work?

本文关键字:字段 何使用 工作 结构 初始化      更新时间:2023-10-16

我正在看一些我困惑的代码。

此片段在标题文件中,rpi.h:

#define BCM2708_PERI_BASE  0x20000000
#define GPIO_BASE         (BCM2708_PERI_BASE + 0x200000) // GPIO controller 
// IO Access
struct bcm2835_peripheral {
    unsigned long addr_p;
    int mem_fd;
    void *map;
    volatile unsigned int *addr;
};
struct bcm2835_peripheral gpio = {GPIO_BASE};
extern struct bcm2835_peripheral gpio;

来自rpi.c文件:

#include "RPI.h"
struct bcm2835_peripheral gpio = {GPIO_BASE};

我对.h和.c文件中的线路感到困惑:

struct bcm2835_peripheral gpio = {GPIO_BASE};

在我看来,正在实例化了一个名为 gpio的类型bcm2835_peripheral的新结构,并将其设置为GPIO_BASE。但是,结构有四个公共成员。他们都被设置为GPIO_BASE吗?

i仅包括相关的.h和.c文件中的行。这些行按原始文件中的顺序。

初始化结构或数组时,您不必为每个元素提供初始化器。

对于那里的初始化器,将按顺序设置字段,而没有初始化器的任何其余字段均设置为0的整数类型,而NULL则用于指针类型。

从C标准的第6.7.9节中:

10 如果未明确初始化具有自动存储持续时间的对象,则其值是不确定的。如果 具有静态或线程存储持续时间的对象不是 显式,然后:

- 如果它具有指针类型,则是 初始化为空指针;

- 如果它具有算术类型,则是 初始化为(正或无符号)零;

- 如果是汇总, 每个成员根据这些规则(递归)的初始化, 并将任何填充物初始化为零位;

- 如果是联盟, 首先命名成员是根据这些初始化的(递归) 规则,任何填充均初始化为零位;

...

21 如果贴式列表中的初始化量少于汇总的元素或成员,或者在字符中少于> 用来初始化已知大小的数组的字符串字符串,而不是 数组中有元素, 汇总应被隐式初始化与对象相同 具有静态存储持续时间。

因此,在这种情况下,addr_p字段设置为GPIO_BASE,而mem_fdmapaddr分别设置为0,NULLNULL