这个字段不足的C/C++结构初始值设定项是如何工作的?

这个字段不足的C/C++结构初始值设定项是如何工作的?,c++,c,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; v

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

此代码段位于头文件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_基地


我只包括了.h和.c文件中相关的行。行的顺序与原始文件中的顺序相同。

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

对于存在的初始值设定项,字段按顺序设置,对于整数类型,没有初始值设定项的任何剩余字段都设置为0,对于指针类型,设置为NULL

根据本手册第6.7.9节:

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

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

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

-如果它是一个集合, 每个成员都根据这些规则进行递归初始化, 并且任何填充被初始化为零位

-如果它是一个联盟,那么 第一个命名的成员根据这些规则递归初始化 规则,并且任何填充都初始化为零位

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


因此,在本例中,addr_p字段设置为GPIO_BASE,而mem_fd、map和addr分别设置为0、NULL和NULL。

struct bcm2835_peripheral GPIO={GPIO_BASE};是在头球吗?Bad Juju,man,C/C++不是语言。C和C++是两种明显不同的语言。在C++标准中,[dCL,init,AGGR]注释8如果列表中的初始化项少于聚合中的元素,则未显式初始化的每个元素都应该从默认成员初始化器9.2初始化,或者如果没有默认的成员初始值设定项,则在空的初始值设定项列表中,这种特殊用法gpio={gpio_BASE}似乎不是很好的风格,因为它初始化第一个对象,不管它是什么,而不是显式地说明它要初始化什么。这也造成了足够的混乱,以致于这个问题无法提出。使用gpio={.addr\u p=gpio\u BASE}这样的函数会更明确。@user34299这是否回答了您的问题?