[英]How does this C/C++ struct initializer with not enough fields work?
我正在看一些我感到困惑的代码。
此代码段位于头文件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
吗?
我只包括相关的.h和.c文件中的行。 这些行按原始文件中的顺序排列。
初始化结构或数组时,您不必为每个元素提供初始值设定项。
对于那里的初始化程序,字段按顺序设置,并且没有初始化程序的任何剩余字段对于整数类型设置为0,对于指针类型设置为NULL
。
从C标准第6.7.9节开始:
10如果未显式初始化具有自动存储持续时间的对象,则其值不确定。 如果未显式初始化具有静态或线程存储持续时间的对象 ,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果它是一个聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零比特;
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零位;
...
21 如果括号括起的列表中的初始值设定项少于聚合的元素或成员 ,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应与具有静态存储持续时间的对象隐式初始化。
因此,在这种情况下, addr_p
字段设置为GPIO_BASE
,而mem_fd
, map
和addr
分别设置为0, NULL
和NULL
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.