首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么linux内核中枚举的第一个成员初始化为0

在Linux内核中,枚举(enum)是一种用于定义一组具有离散值的常量的数据类型。枚举常量默认情况下从0开始递增,每个常量都有一个唯一的整数值。

第一个成员初始化为0的原因是为了方便默认情况下的初始化和比较操作。由于枚举常量是整数值,将第一个成员初始化为0可以确保在未显式赋值的情况下,默认情况下枚举变量的值为0。这样可以简化代码,并且在比较枚举变量时可以直接使用等于(==)操作符进行比较。

例如,假设有一个枚举类型定义如下:

代码语言:c
复制
enum Color {
    RED,
    GREEN,
    BLUE
};

在这个例子中,RED的值为0,GREEN的值为1,BLUE的值为2。如果没有指定初始值,RED将自动初始化为0,这样可以方便地使用默认值。

总结起来,将枚举的第一个成员初始化为0是为了方便默认情况下的初始化和比较操作,简化代码,并且提供直观的默认值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何调整Linux内核启动驱动初始化顺序?

如何调整Linux内核启动驱动初始化顺序? 【问题】 此处我要实现是将芯片ID用于网卡MAC地址,网卡驱动是enc28j60_init。...此处,内核编译完之后,在生成system.map可以看到, enc28j60_init在as352x_afe_init之前,所以,无法去读芯片ID。...【解决过程】 【1】 最简单想到,是内核里面的 arch\arm\mach-as352x\core.c ,去改devices设备列表顺序。...【2】 在网上看到很多帖子,其说明也很清楚了,就是: Linux内核为不同驱动加载顺序对应不同优先级,定义了一些宏: include\linux\init.h #define pure_initcall...具体添加一个新优先级步骤如下: 1.定义新优先级 include\linux\init.h: #define pure_initcall(fn) __define_initcall("0"

4K31

Linux 内核 内存管理】分区伙伴分配器 ⑤ ( 区域水线 | 区域水线数据结构 zone_watermarks 枚举 | 内存区域 zone 区域水线 watermark 成员 )

区域水线 watermark 成员 一、区域水线 ---- " 首选内存区域 “ 在特定情况下 从 ” 备用内存区域 “ 借用物理内存 , 该 " 特定情况 " 与 ” 区域水线 " 有关 ; 每个...枚举 ( WMARK_MIN | WMARK_LOW | WMARK_HIGH | NR_WMARK ) ---- 区域水线对应数据结构 定义在 linux 内核源码 linux-4.12\include...\linux\mmzone.h#255 位置 , 是一个枚举 ; enum zone_watermarks { WMARK_MIN, WMARK_LOW, WMARK_HIGH, NR_WMARK...}; 源码路径 : linux-4.12\include\linux\mmzone.h#255 三、内存区域 zone 区域水线 watermark 成员 ---- " 内存区域 " struct...zone 结构体 unsigned long watermark[NR_WMARK]; 成员是 内存区域 " 页分配器 " 使用 区域水线 ; struct zone { /* Read-mostly

1.8K10

Linux 内核 内存管理】memblock 分配器 ⑤ ( Linux 内核定义 memblock 分配器位置 | ARM64体系架构下 Linux内核初始化 memblock 分配器流程 )

文章目录 一、Linux 内核定义 memblock 分配器位置 二、ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 三、arm64_memblock_init 函数完整源码...一、Linux 内核定义 memblock 分配器位置 ---- Linux 内核 定义 memblock 分配器 位置 : Linux 内核源码 linux-4.12\mm\memblock.c...-4.12\mm\memblock.c#34 二、ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 ---- 先在 linux-4.12\init#488 位置 asmlinkage...__visible void __init start_kernel(void) 内核启动函数 , 调用 setup_arch(&command_line); 函数 , 然后再调用 ARM64 体系架构对应源码...分配器核心函数 ; ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 : ① 解析 " 设备树二进制文件 " /memory 节点 , 将 " 所有物理内存 " 纳入到

89310

Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体 start_brk、brk 成员 )

文章目录 一、堆内存管理 二、内存描述符 mm_struct 结构体 三、mm_struct 结构体 start_brk、brk 成员 一、堆内存管理 ---- Linux 操作系统 " 堆内存...Linux 内核实现 , 开发者 不知道 堆管理细节 , 只通过 " 系统调用 " 调用相关函数 ; " brk 系统调用 " 负责 扩展 和 收缩 堆内存 ; 在 " 内存描述符结构体 " mm_struct...结构体 ---- mm_struct 结构体 定义在 Linux 内核源码 include\linux\mm_types.h#375 源码 ; mm_struct 结构体 源码 : struct mm_struct...-5.6.18\include\linux\mm_types.h#375 三、mm_struct 结构体 start_brk、brk 成员 ---- mm_struct 结构体 start_brk...、brk 成员 , 分别是 " 堆内存 " 在 " 虚拟地址空间 " 开始 和 结束 地址 , 其定义在 Linux 内核源码 linux-5.6.18\include\linux\mm_types.h

85720

C语言进阶——自定义类型

声明后初始化: 使用前初始化: 当然结构体初始化还有更多玩法,比如下面的指定成员初始化: 嵌套定义: 注意: 1.全局变量默认初始化为0,局部变量为随机值 2.当对局部变量进行指定成员初始化时...,其他成员初始化为0 3.结构体嵌套定义时,初始化子字符串需要再次进行访问  6.内存对齐   内存对齐是个很有意思东西,为了方便数据读取,设计出了这么个东西。...图片来源:百度百科 内存对齐规则: 1.结构体第一个成员,对齐至结构体起始位置0偏移处 2.从第二个成员开始,要对齐至某个对齐数整数倍偏移处(对齐数:结构体成员自身大小和默认对齐数较小值...,VS默认对齐数为8字节,Linux没有设置默认对齐数) 3.结构体总大小必须是最大对齐数整数倍,最大对齐数就是结构体成员对齐数最大值 4.如果是结构体嵌套情况,则嵌套结构体要对齐到自己最大对齐数整数倍处...,即 enum tag { }; 值得一提是,枚举成员变量定义时,不是以分号 ; 结尾,而是以逗号 , 区分,并且最后一个枚举成员不用加任何符号,关于枚举常量大小(标准未定义),在VS是4字节

26720

C++枚举类型enum与enum class

所谓”枚举”是指将变量值一一列举出来,变量值只能在列举出来范围内。在C++枚举类型分为不限定作用域(enum)和限定作用域(enum class)。   ...2. enum与enum class区别? (为什么需要限定作用域?)  答:枚举作用域是指枚举类型成员名字作用域,起自其声明之处,终止枚举定义结束之处。...“,”而不是”;” 最后一个成员可省略”,”初始化时可以赋负数,以后标识符仍依次加1。...枚举变量只能取枚举说明结构某个标识符常量。在外部可以对枚举变量进行赋值,但需要进行类型转换。枚举常数可以隐式转换为int,但是int不可以隐式转换为枚举值。...为枚举每个名称分配一个整数值,该值与其在枚举顺序相对应。默认情况下,第一个值分配0,下一个值分配1,依次类推,但也可以显示设置枚举名称值。枚举值可以用来作判断比较。

4.1K40

C语言进阶—自定义类型:结构体,枚举,联合

计算结构体大小 首先得掌握结构体对齐规则 1.第一个成员在与结构体变量偏移量为0地址处。 2.其他成员变量要对齐到某个数字(对齐数)整数倍地址处。...VS默认值为8 Linux没有默认对齐数,对齐数就是成员自身大小 Linuxgcci个编译器是没有默认对齐数 3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数,最大对齐数即为该结构体各个对齐数相比较最大值...位段成员在内存从左向右分配,还是从右向左分配标准尚未定义。 4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余位时,是舍弃剩余位还是利用,这是不确定。...{}内容是枚举类型可能取值,也叫 枚举常量 。...这些可能取值都是有值,默认从0开始,一次递增1,当然在定义时候也可以赋初值 但是它值是固定不能更改 2.枚举优点 为什么使用枚举

6410

Linux 内核 内存管理】memblock 分配器 ③ ( memblock_region 内存块区域 | memblock_region 结构体成员分析 | memblock 分配器标志位 )

---- memblock 分配器 , 内存块区域 使用 struct memblock_region 结构体进行描述 , 该结构体定义在 Linux 内核源码 linux-4.12\include...-4.12\include\linux\memblock.h#31 二、memblock_region 结构体成员分析 ---- 1、base 成员 base 成员 表示 " 内存块区域 " 起始地址...nid 成员 nid 成员 表示 " 内存块区域 " 节点编号 ; #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP int nid; #endif 三、memblock 分配器标志枚举...---- memblock 分配器标志是一个枚举类型 , 该 枚举 定义在 Linux 内核源码 linux-4.12\include\linux\memblock.h#23 位置 ; /* Definition...镜像区域 " ; Linux 内核将 内存数据 , 进行了复制备份 , 分别存放在 " 主内存 " 和 " 镜像内存 " ; MEMBLOCK_MIRROR = 0x2, /* mirrored

32420

Linux X86-ACPI PNP Hardware ID识别框架

分析内核是如何获取BIOS传递参数表 接下来主要来看看在Linux内核内核是怎么去通过BIOS传递参数表,传递对应字串,然后内核又是如何来解析它,最终为Linux驱动统一模型所用。...以下是较为重要结构体描述: 1在这个结构体里发现,_HID是以内核链表成员形式加载进Linux内核 2(内核源码/include/acpi/Acpi_bus.h) 3struct acpi_hardware_id...帮内核设置串口: 内核启动开始部分会从串口打印一些信息,但是内核一开始没有初始化串口 */ 2 uart0_init(); 3 4 /* 1....接下来我们来看看在X86 Linux内核启动过程,是如何去识别BIOS传递过来Hardware ID?...不管是ARM架构还是X86架构CPU,在启动Linux内核时候一定要进入start_kernel函数,这个函数位于: 内核源码/init/main.c 在这个函数,会做操作系统设备等一系列初始

4K43

【C自定义类型详解】——结构体(struct)、位段、枚举(enum)、联合(union)

我们也可以进行初始化: struct Point { int x; int y; }p1={1,2};//p1结构体成员x=1,y=2 struct Point p2={3,4}; //p2结构体成员...第一个成员在与结构体变量偏移量为0地址处。 2. 其他成员变量要对齐到某个数字(对齐数)整数倍地址处。 对齐数 = 编译器默认一个对齐数 与 该成员大小较小值。...第一条我们很好理解,就是第一个成员从偏移量为0位置开始, 那么后面的具体是什么意思呢?...当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余位时,是 舍弃剩余位还是利用,这是不确定 2、枚举(enum) 枚举就是列举,即把可能取值一一列举。...联合体使用 百度笔试题: 判断当前计算机大小端存储 这道题在之前文章写过了一种方法,就是先定义一个变量,初始化为1,然后强制类型转换为char*,然后解引用,就会访问第一个字节,如果是1,

89620

预处理--》编译--》运行区别

枚举类型成员是常量,它们值由编译器自动分配,例如定义了上面的枚举类型之后,RECTANGULAR就表示常量0,POLAR 表示常量1。...枚举常量也是一种整型,其值在编译时确定,因此也可以出现在常量表达式,可以用于初始化全局变量或者作为case 分支判断条件。...,可以看到打印完之后里面的rectanger变量就会被释放,但polar变量得等整个函数调用完毕才会释放,因为这里使用枚举类型成员。...,则初始化为0,位于.bss段。...反正处理步骤就是 预处理 --》 编译 --》 运行,但步骤不同是涉及到很多东西,比如全局变量和局部变量赋值,为什么全局变量只能用常量来初始化而局部变量可以用带数学函数表达式来初始化呢?

86170

C++ Primer Plus 第四章 复合类型 学习笔记

4.如果初始化为{1}而不是{0},则第一个元素被设置为1,其他元素都被设置为0. 5.如果初始化数组方括号内([])为空,C++编译器将计算元素个数。...也可以只显示定义其中一些枚举值。 如果第一个变量未初始化,默认为0。后面没有被初始枚举值将比其前面的枚举量大1。也可以创建多个值相同枚举量。...然后将其初始化为wages - - - wages数组第一个元素地址。...short * ps = &wages[0]; // 使用地址操作;使用地址运算符来将ps指针初始化为stacks数组第一个元素。...不可以对未初始化为适当地址指针解除引用。 8.1.4 数组名 多数情况下,C++将数组名视为数组第一个元素地址。

1.8K00

【C语言】数组&&结构体&&枚举&联合详解

int arr1[10] = { 1,2,3 }; 这种叫做//不完全初始化,剩余元素默认初始化为0 我们使用监视窗口可以发现 数组在创建时候如果想不指定数组的确定大小就得初始化。...与 该成员大小较小值 vs默认值为8 Linux没有默认对齐数,对齐数就是成员自身大小 下面这篇文章详细解释了结构体内存对齐规则 C语言--结构体内存对齐规则_结构体对齐原则-CSDN...16,32位机器最大32,写成27,在16位机器会出问题 位段成员在内存从左向右分配,还是从右向左分配标准尚未定义 当一个结构体包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余位时,...,比如: 4.2 枚举优点 为什么使用枚举?...我们可以使用#define定义常量,为什么非要使用枚举

10710

【C】结构体+自定义类型知识点大全(基础,进阶,简洁,全面)

:结构体内存对齐规则 对齐数:结构体成员自身大小和默认对齐数较小值 PS:Linux环境默认不设对齐数(对齐数是结构体成员自身大小) 规则: 每个结构体成员都有一个对齐数,成员对齐数中最大即为结构体最大对齐数...结构体第一个成员直接对齐到相对于结构体变量起始位置为0偏移处 从第二个成员开始,要对齐到某个【对齐数】整数倍偏移处 结构体总大小,必须是最大对齐数整数倍 例: 二:为什么存在结构体内存对齐...) 位段成员在内存从左向右分配,还是从右向左分配标准尚不确定 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余位时。...使用要点: 枚举每一个可能取值是常量 枚举常量都有默认值(依次0,1,2...)...}; 枚举所有可能取值 2.枚举相较于#define优点 我们可以用#define定义常量,为什么非要使用枚举

7610

Linux内存描述之内存区域zone--Linux内存管理(三)

任何种类数据页都可以存放在任页框, 没有任何限制. 但是Linux内核又把各个物理内存节点分成个不同管理区域zone, 这是为什么呢?...如在64位系统, 并不需要高端内存, 因为AM64linux采用4级页表,支持最大物理内存为64TB, 对于虚拟地址空间划分,将0x0000,0000,0000,0000 – 0x0000,7fff...15MB ZONE_NORMAL 16MB~895MB ZONE_HIGHMEM 896MB~物理内存结束 而由于32位系统, Linux内核虚拟地址空间只有1G, 而0~895M这个986MB被用于..., 并最后决定在页面前实际链表中分配多少各页面 4.7 内存域第一个页帧zone_start_pfn struct zone通过zone_start_pfn成员标记了内存管理区页面地址....该数组项大小MAX_ZONELISTS用一个匿名枚举常量定义, 定义在include/linux/mmzone.h?

9.1K31

自定义类型:结构体+枚举类型+联合体+(内存对齐原则)

结构体内存对齐(重点)  光看文字很难理解,我们加上例题分析: 例题1: 第一个成员变量从地址0处开始,vs默认对齐数是8,char类型大小是1,选择其中较小值作为对齐数,所以是1。...最终占用0~31这32个字节。 内存对齐这么复杂,为什么要有这东西呢?难道是为了给自己添加麻烦吗? 当然不是!  ...其中第一个括号数字就是默认对齐数。修改数字应该为2次方数,例如:1,2,4,8…… 位段 什么是位段?...{}内容是枚举类型可能取值,也叫枚举常量 。这些可能取值都是有默认值,默认从0开始,逐个+1。当然也可以在最开始给定初值,但是在外面就不能改变了,因为这是一个常量。...枚举好处 明明可以用 #define 代替,为什么还要用枚举呢? 1、增加代码可读性和可维护性。 2、和 #define 定义标识符相比,枚举有类型检查,更加严谨。

40630

Gopro Ardunio控制库.2

这是我们第一个函数 ? 这样看起来有点清晰 ? 首先解决这个问题. ? ? C++变量前面加下划线和不加下划线都不会影响对变量定义,只是风格问题,更喜欢将成员变量或者私有成员变量前面加上下划线。...模式切换->setting->传0进去 ? 看枚举值 ---- 枚举变量未分配初始值。默认情况下,第一个枚举成员默认值为“0”,后续枚举成员dao值为前一个枚举成员值(按文本顺序)加一。...枚举元素只能是标识符,而不是数字常量或字符常量。枚举在C/C++/c#,是一个被命名整型常数集合, 枚举在日常生活很常见。...扩展资料使用枚举类型注意:枚举每个成员(标识符)结束符是"," 不是";", 最后一个成员可省略","。初始化时可以赋负数, 以后标识符仍依次加1。枚举变量只能取枚举说明结构某个标识符常量。...枚举值有点迷, hero4->4就是这样了..... ? 看注意事项 ? 不知道你们有没有看懂我为什么还在这里研究,就是我觉得枚举值不对, 看下面的这些东西应该是枚举值得基础上再加1????为什么

51610

【RT-Thread笔记】内核对象模型

在代码,这些对象被汇总到一个枚举(在rtdef.h): enum rt_object_class_type { RT_Object_Class_Null = 0,...有点不明白是,线程对象结构体怎么直接把rt_object里内容全搬过来了,而不是像定时器对象结构体那样定义一个rt_object类型成员以达到继承目的。...静态内核对象使用内存空间是编译时决定,且运行过程是不会变化,只有当程序退出时候这些内存空间才会被系统回收。 动态内核对象使用内存空间是动态分配,即在程序运行过程动态分配。...C语言知识:如果枚举类型成员值没有具体指定,那么后一个值是在前一个成员基础上加1。 struct rt_object_information内容如下: ?...结构体数组(对象容器)rt_object_container对象链表初始化为: ?

66010

结构体,自定义类型

offsetof是一个宏,可以直接使用,是用来计算结构体成员相较于起始位置偏移量。 上图是S1占用空间示意图,结合下面的规则,我们来分析。 分析:c1是第一个成员,起始位置从0开始。...结构体对齐规则: 第一个成员在与结构体变量偏移量为0地址处。...linux没有默认对齐数,对齐数就是成员自身大小。 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)整数倍。...位段成员在内存从左向右分配,还是从右向左分配标准尚未定义。 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余位时,是舍弃剩余位还是利用,这是不确定。...花括号内容是枚举类型可能取值,也叫枚举常量。 这些可能取值都是有值,默认从0开始,依次递增1。当然,在声明枚举类型时候也可以赋初值。 联合(共用体) 联合也是一种特殊自定义类型。

11810

【C语言】自定义类型详解:结构体、枚举、联合

第一个成员在与结构体变量偏移量为0地址处:所以c1在偏移量为0处,且c1占一个字节; 其他成员变量要对齐到它对齐数整数倍地址处:由于 i 对齐数是4,所以 i 只能从偏移量为4位置开始存储...;c 变量占一个比特位,并把剩余3个比特位丢弃;d 变量占4个比特位,并把剩下四个比特位丢弃;所以 struct S 一共占3个字节打下;然后在 main 函数把结构体成员全部初始化为0;此时内存数据是...3、枚举优点 我们知道,在C语言中我们可以利用 #define 来定义常量,那为什么还要单独设计出一个枚举类型来定义枚举常量呢?...= GREEN; //使用枚举类型定义枚举变量并初始化 ---- 三、联合 1、什么是联合 联合是一种特殊自定义类型,这种类型定义变量包含一系列成员,特征是这些成员公用同一块空间(所以联合也叫共用体...1 return un.c; //返回 c 变量,即返回内存第一个字节数据,小端,内存第一个字节数据为1 ,大端则为0 } int main() { int ret = Check_Sys

58500
领券