这个字段不足的C/C++结构初始值设定项是如何工作的?
我正在看一些令我困惑的代码 此代码段位于头文件RPI.h中:这个字段不足的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
#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这是否回答了您的问题?