具有不足字段的此C/C++ struct初始化程序如何工作?

use*_*299 3 c c++

我正在看一些我感到困惑的代码.

此代码段位于头文件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;
Run Code Online (Sandbox Code Playgroud)

从RPI.c文件:

#include "RPI.h"

struct bcm2835_peripheral gpio = {GPIO_BASE};
Run Code Online (Sandbox Code Playgroud)

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

struct bcm2835_peripheral gpio = {GPIO_BASE};
Run Code Online (Sandbox Code Playgroud)

在我看来,一个bcm2835_peripheral名为named 的新结构gpio被实例化并设置为等于GPIO_BASE.但是,该结构有四个公共成员.它们都被设定为GPIO_BASE

我只包括相关的.h和.c文件中的行.这些行按原始文件中的顺序排列.

dbu*_*ush 10

初始化结构或数组时,您不必为每个元素提供初始值设定项.

对于那里的初始化程序,字段按顺序设置,对于整数类型和NULL指针类型,没有初始化程序的任何剩余字段都设置为0 .

C标准第6.7.9节开始:

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

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

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

- 如果它是一个聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零比特;

- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零位;

...

21 如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素 ,则聚合的其余部分应与具有静态存储持续时间的对象隐式初始化.

因此,在这种情况下,addr_p字段设置为GPIO_BASE,同时mem_fd,mapaddr被设置为0,NULLNULL分别.

  • 和 **[dcl.init.aggr]** C++ 标准中的注 8 *如果列表中的初始化子句少于聚合中的元素,则每个未显式初始化的元素都应从其默认成员初始化器进行初始化(9.2) 或者,如果没有默认成员初始值设定项,则来自空初始值设定项列表* (2认同)