此C/C 的结构初始化器如何使用足够的字段工作
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
吗?
i仅包括相关的.h和.c文件中的行。这些行按原始文件中的顺序。
初始化结构或数组时,您不必为每个元素提供初始化器。
对于那里的初始化器,将按顺序设置字段,而没有初始化器的任何其余字段均设置为0的整数类型,而NULL
则用于指针类型。
从C标准的第6.7.9节中:
10 如果未明确初始化具有自动存储持续时间的对象,则其值是不确定的。如果 具有静态或线程存储持续时间的对象不是 显式,然后:
- 如果它具有指针类型,则是 初始化为空指针;
- 如果它具有算术类型,则是 初始化为(正或无符号)零;
- 如果是汇总, 每个成员根据这些规则(递归)的初始化, 并将任何填充物初始化为零位;
- 如果是联盟, 首先命名成员是根据这些初始化的(递归) 规则,任何填充均初始化为零位;
...
21 如果贴式列表中的初始化量少于汇总的元素或成员,或者在字符中少于> 用来初始化已知大小的数组的字符串字符串,而不是 数组中有元素, 汇总应被隐式初始化与对象相同 具有静态存储持续时间。
因此,在这种情况下,addr_p
字段设置为GPIO_BASE
,而mem_fd
,map
和addr
分别设置为0,NULL
和NULL
。
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何使用位字段将数据从二进制文件复制到结构中?
- 使用同一类中的方法重新分配字段时出现问题
- 使用不同的字段解析消息
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 使用 Boost::Hana 中的 BOOST_HANA_DEFINE_STRUCT 定义具有 40 个以上字段的结构
- 如何使用函数的输出初始化 const 数组结构字段?
- 如何在 c++ 中使用多态性访问派生类字段?
- 如何使用连接器 c++ 在 mySQL 表二进制(16) 字段中存储 c++ 字节数组?
- 使用 istream 提取运算符进行 csv 解析:如何检测缺失的字段值?
- 如何使用DP绘制具有n种不同颜色的r x r字段,而无需在同一行使用相同的颜色
- 在C++中使用 RapidJSON 访问 JSON 数组的字段
- 如何使用迭代器初始化地图的键字段?
- Protobuf序列化长度在使用不同的字段值时会有所不同
- 在C++(arduino)中,我如何使用一个字段来构建另一个字段
- 如何使用 gtest 构造检查存储在向量中的结构(字段)?
- 在结构中使用位字段并使用C++从内存中读取实例
- 在子字段上使用std ::前进
- PCL:访问 pcl::ModelCoefficients::P tr 的字段,使用 RANSAC 进行线模型近似
- 为什么在c++字段中使用非指针