C99结构体指定初始化

C99指定初始化器完全指南:从数组到结构体的5个高效用法 本文深入解析C99标准中的指定初始化器特性,提供了从数组到结构体的五种高效用法指南。通过精准初始化数组元素、实现顺序无关的结构体初始化、构建清晰的常量映射表、处理复杂嵌套结构以及与宏结合配置等实战案例,帮助开发者编写更清晰、更易维护的现代C语言代码,显著提升开发效率与代码质量。 阅读详情
毕业不是学习的终结,我感觉我的学习才刚刚开始。我与未来工作岗位的差距太大,我是好强的人,不甘人后。我不希望成为团队中的鸡肋或一个可有可无的人。我没有光鲜的文凭、扎实的技术,我能做的只有拼搏奋斗了。
 
以上这段话来自优快云上一个博客http://blog.youkuaiyun.com/zhsxcn,看了日期,估计作者也是跟我一样今年毕业的,上面那句话也说到自己的心上,希望自己也能做好来~~


看了他博客中“毕业前夕”,也不禁想起自己找工作过程的艰辛,只是我比他准备得更充分些而已,也感谢上天对我的眷顾,我会努力做好来~~ 

至于为什么会找到他的blog?因为他博客中有一篇关于C99标准中,对结构体指定初始化(designated initializer)的介绍。以下收集了一下网上关于指定初始化的介绍:



在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式。该方式是某些C教材(如谭二版、K&R二版)中没有介绍过的。这种方式称为指定初始化(designated initializer)。下面我们看一个例子,Linux-2.6.x/drivers/usb/storage/usb.c中有这样一个结构体初始化项目:
static struct usb_driver usb_storage_driver = {
       .owner = THIS_MODULE,
       .name = "usb-storage",
       .probe = storage_probe,
       .disconnect = storage_disconnect,
       .id_table = storage_usb_ids,
};
    乍一看,这与我们之前学过的结构体初始化差距甚远。其实这就是前面所说的指定初始化在Linux设备驱动程序中的一个应用,它源自ISO C99标准。以下我摘录了C Primer Plus第五版中相关章节的内容,从而就可以很好的理解2.6版内核采用这种方式的优势就在于由此初始化不必严格按照定义时的顺序。这带来了极大的灵活性,其更大的益处还有待大家在开发中结合自身的应用慢慢体会。
    已知一个结构,定义如下
struct book {
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
};
    C99支持结构的指定初始化项目,其语法与数组的指定初始化项目近似。只是,结构的指定初始化项目使用点运算符和成员名(而不是方括号和索引值)来标识具体的元素。例如,只初始化book结构的成员value,可以这样做:
    struct book surprise = { .value = 10.99 };
    可以按照任意的顺序使用指定初始化项目:
    struct book gift = { .value = 25.99,
                                    .author = "James Broadfool",
                                    .title = "Rue for the Toad"};
    正像数组一样,跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值。例如,考虑下列声明:
    struct book gift = { .value = 18.90,
                                    .author = "Philionna pestle",
                                    0.25};
    这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。
    有关designated initializer的进一步信息可以参考c99标准的6.7.8节Ininialization。

摘自: http://blog.youkuaiyun.com/zhsxcn/archive/2008/02/27/2125211.aspx


5.22 特定的初始化

标准C89需要初始化语句的元素以固定的顺序出现,和被初始化的数组或结构体中的元素顺序一样。

在ISO C99中,你可以按任何顺序给出这些元素,指明它们对应的数组的下标或结构体的成员名,并且GNU C也把这作为C89模式下的一个扩展。这个扩展没有在GNU C++中实现。

为了指定一个数组下标,在元素值的前面写上“[index] =”。比如:

 
int a[6] = { [4] = 29, [2] = 15 };
            

相当于:

 
int a[6] = { 0, 0, 15, 0, 29, 0 };
            

下标值必须是常量表达式,即使被初始化的数组是自动的。

一个可替代这的语法是在元素值前面写上“.[index]”,没有“=”,但从GCC 2.5开始就不再被使用,但GCC仍然接受。为了把一系列的元素初始化为相同的值,写为“[first ... last] = value”。这是一个GNU扩展。比如:

 
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
            

如果其中的值有副作用,这个副作用将只发生一次,而不是范围内的每次初始化一次。

注意,数组的长度是指定的最大值加一。

在结构体的初始化语句中,在元素值的前面用“.fieldname = ”指定要初始化的成员名。例如,给定下面的结构体,

 
struct point { int x, y; };
            

和下面的初始化,

 
struct point p = { .y = yvalue, .x = xvalue };
            

等价于:

 
struct point p = { xvalue, yvalue };
            

另一有相同含义的语法是“.fieldname:”,不过从GCC 2.5开始废除了,就像这里所示:

 
struct point p = { y: yvalue, x: xvalue };
            

“[index]”或“.fieldname”就是指示符。在初始化共同体时,你也可以使用一个指示符(或不再使用的冒号语法),来指定共同体的哪个元素应该使用。比如:

 
union foo { int i; double d; };
            union foo f = { .d = 4 };
            

将会使用第二个元素把4转换成一个double类型来在共同体存放。相反,把4转换成union foo类型将会把它作为整数i存入共同体,既然它是一个整数。(参考5.24节向共同体类型转换。)

你可以把这种命名元素的技术和连续元素的普通C初始化结合起来。每个没有指示符的初始化元素应用于数组或结构体中的下一个连续的元素。比如,

 
int a[6] = { [1] = v1, v2, [4] = v4 };
            

等价于

 
int a[6] = { 0, v1, v2, 0, v4, 0 };
            

当下标是字符或者属于enum类型时,标识数组初始化语句的元素特别有用。例如:

 
int whitespace[256]
            = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
            ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
            

你也可以在“=”前面写上一系列的“.fieldname”和“[index]”指示符来指定一个要初始化的嵌套的子对象;这个列表是相对于和最近的花括号对一致的子对象。比如,用上面的struct point声明:

 
struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
            

如果同一个成员被初始化多次,它将从最后一次初始化中取值。如果任何这样的覆盖初始化有副作用,副作用发生与否是非指定的。目前,gcc会舍弃它们并产生一个警告。


来源:http://blog.hjenglish.com/bedford/articles/1078996.html

【花雕学编程】Arduino FOC 之AS5048A磁编码器模块 您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。在Arduino平台上实现FOC可以提供平滑的运行和高度的扭矩、速度和位置控制,它通过精确控制电机的电流和电压来实现高效率、高精度和低噪声的操作。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1、高性能电机控制:FOC是一种高级的电机控制算法,可以精准控制PMSM(永磁同步电机)和BLDC(无刷直流)电机,实现平滑的转速和扭矩输出。 阅读详情

相关推荐

从零开始之stm32之CAN通信

CAN通信极简教程(小白友好版),从小白的视角了解并实现简单的STM32F103的CAN通信,直接上手。

qq_30993593的博客 1306

结构体初始化的四种方法

结构体初始化的四种方法 从事嵌入式开发后开始使用C来编程。刚开始觉得非常拧巴,经常阅读C代码也就慢慢习惯了。由于没有类的概念,结构体在C中大量使用,今天聊聊结构体变量初始化的四种方法。 C语言中结构体初始化的四种方法 举例: typede struct block { char name[32]; int type; int size; }block; 方法一:定义时赋值 block test = {"version", 1, 32}; 需要注意对应的顺序,不能错

量子象限 4万+

本地部署静态网站托管平台 Netlify 并实现外部访问(Windows 版本)

Netlify 是一款基于云计算的网站部署和托管平台,专为开发者提供便捷的静态网站和 Jamstack 应用部署服务。它的能力在于将网站构建、部署、托管以及持续集成等流程高度集成,简化了开发和运维的复杂程度。用户无需关心服务器的配置、维护等工作。本文将详细介绍如何在本地安装 Netlify 以及结合路由侠内网穿透实现外网访问 Netlify。

lyxnwct的博客 523

结构体的几种初始化方法

基本初始化是最常用的结构体初始化方法,通过使用“{}”括号来初始化结构体变量。常量表达式初始化可以在结构体定义时用常量表达式对结构体成员进行初始化。指定成员初始化可以通过指定成员名来初始化结构体的成员变量。3.常量表达式初始化。4. 定义后逐个赋值。

m0_61973119的博客 1万+

《深入浅出图神经网络:GNN原理解析》学习笔记

期末考完了,该上道了 目录一、图的概述1.基本概念2.图的存储和遍历3.应用分类二、神经网络基础1.机器学习2.神经网络三、卷积神经网络(CNN)1.卷积与池化2.卷积神经网络四、表示学习1.意义2.自编码器五、图信号处理与图卷积神经网络1.矩阵计算前置知识2.图信号与图的拉普拉斯矩阵3.图傅里叶变换4.图滤波器(Graph Filter)5.图卷积神经网络(GCN) 一、图的概述 1.基本概念 1.顶点(Vertex)表示研究的对象,边(Edge)表示两个对象之间特定的研究关系 2.图为顶点和边的集合.

且视他人之疑目如盏盏鬼火,大胆地去走你的夜路 2047

研发工作量科学量化评估模型:从多维系数到等级落地指南

摘要:本文提出了一套基于多维系数的科学量化评估模型,用于精准评估软件开发工作量。该模型从需求复杂度、技术难度、质量要求和依赖风险四个核心维度进行量化评估,通过系数乘积计算综合工作量。文章详细说明了各维度的系数区间划分标准,并演示了从基础工作量估算到综合系数计算的具体步骤。该模型通过结构化评估过程,将主观经验转化为客观量化指标,帮助团队提高工作量评估的准确性,增强项目交付的可预测性。其价值在于使评估过程透明化、结构化和可追溯,从而减少项目延期风险,优化资源规划。

友莘居士的博客 1681

结构体的定义以及初始化,结构体成员的两种访问方式,结构体传参

详细讲解结构体的定义以及初始化,结构体访问成员变量的方式。使用结构体时注意事项。里面几乎讲到了结构体所有的东西

qq_57780685的博客 4786

YOLO系列算法改进 | Neck改进篇 | 融合FAAFusion傅里叶角度对齐模块 | 攻克多尺度方向特征冲突,角度检测精度飙升! | CVPR 2026

YOLO系列算法改进 | Neck改进篇 | 融合FAAFusion傅里叶角度对齐模块 | 攻克多尺度方向特征冲突,角度检测精度飙升! | CVPR 2026 (以YOLO26最新目标检测模型为基础,利用FAAFusion傅里叶角度对齐模块改进Neck部分)

2502_91881744的博客 315

关于结构体初始化的自我小结

前段时间在一个项目中使用到结构体数组来存储产品不同型号的参数,使程序通用化,便于测试和快速生产。由于之前很少使用结构体数组,在初始化时遇到了一点小阻碍,于是便想到对于结构体和其数组的初始化操作做一个小总结: 结构体 结构体初始化其实有多种方式,以一个经典模板为例: #include <stdio.h> struct Student{ char *name; int age; float score; }stu = {"小王",18,80.5}; int main(){ print

cedar_king的记录 7258

计算电磁学(三)有限差分方法

有限差分方法(FDM)是一种数值处理方法,通过将偏微分方程变换为一组代数方程,通过求解代数方程组来得到原边值问题的近似值。由于有限差分法非常简单,所以也特别的稳定高效。其中时域有限差分方法(FDTD)是电磁分析中的常用方法。在计算电磁学中,常用有限差分方法(finite difference equations)来替代微分方程。一个有限差分法通常包括三个步骤将求解域划分网格用有限差分方程逼近给定的微分方程求解在给定边界条件和初始状态下的方程常用的网格模型方阵斜方阵三角阵圆形阵。

CCC_B的博客 1639

Android14 Qcom 从Framework到Driver带你打开WIFI(二)

上篇文章讲到了UI打开WIFI以后,逐步调用到加载底层驱动以及通知等相关流程。这篇接着上文继续往下看WIFI ON的后续动作。

IAYLBL的博客 764

C语言----初始结构体详解

此文是作者初次学习C语言的时候,写的笔记博文,如有错误请及时指正,谢谢!!! 1,什么是结构体 我们已经学过的数据类型有 char, int,long, short, long long, float, double,这些类型只能描述单一的对象,不能描述复杂的对象。 比如现在我们要描述一个学生类型的复杂对象,需要描述他的名字, 年龄, 性别, 成绩----。 我们就需要吧char类型的, int类型的, float类型的。整合到一起共同构成这个复杂对象。把这些单一对象和在一起就需要用到结构体。 ..

zxf123567的博客 6664

Open Dynamics Engine(ODE)物理引擎教程(1)--下载与安装准备

引言 ODE是一个免费的工业级库,用于模拟关节式刚体动力学,例如地面车辆、腿部生物和虚拟现实环境中的移动对象。它具有快速、灵活、健壮和独立于平台的特点,具有先进的关节、摩擦接触和内置的碰撞检测功能。 项目主页:http://www.ode.org/ 线上手册:http://ode.org/wiki/index.php?title=Manual 本教程为博主亲自亲测过程的总结,转载请注明出处! ...

腿足机器人领域 2216

C99 Designated initializers(结构体指定初始化)

在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式,这种方式称为指定初始化(Designated initializers)。Designated initializers, a C99 feature, are supported for aggregate types, including arrays, structures, and unions. A designated initializer, or designator, points out a particular e

tongyitongyi的专栏 4252

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C99结构体指定初始化-tonywang

今天学习linux source code时,奇怪的发现如下的code: static struct usb_driver usb_storage_driver = {       .owner = THIS_MODULE,       .name = "usb-storage",       .probe = storage_probe,       .d

tonywang_K的专栏 482

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C99 结构体指定初始化

<br />    在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式。该方式是某些C教材(如谭二版、K&R二版)中没有介绍过的。这种方式称为指定初始化(designated initializer)。下面我们看一个例子,<br />     Linux-2.6.x/drivers/usb/storage/usb.c中有这样一个结构体初始化项目:<br />static struct usb_driver usb_storage_driver = { .ow

工作流水薄 818

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C99标准支持结构体按成员名称进行指定初始化。

今天和同事讨论发现,C99支持对结构体进行指定成员的初始化方式了,前阵子在python上见过,感觉很方便,现在C语言也支持了,需要注意的是,要求编译器支持C99的特性。 下面是C99的原文描述,在6.7.8 Initialization 章节有如下描述: 17 Each brace-enclosed initializer list has an associated current

喜欢编程的小兵 1202

C语言结构体初始化演进:从传统顺序到C99指定初始化器

在C语言编程中,结构体初始化是确保内存数据安全可控的基础操作。其核心原理是为结构体变量成员赋予初始值,以避免未定义行为和潜在的程序错误。这项技术的价值在于提升代码的健壮性、可读性与可维护性,尤其在嵌入式系统、操作系统内核等对稳定性和安全性要求极高的领域至关重要。从应用场景看,无论是简单的数据封装还是复杂的嵌套结构,清晰可靠的初始化都是项目稳健运行的基石。随着C语言标准演进,C99引入的指定初始化器(Designated Initializers)通过显式命名成员进行赋值,彻底解决了传统顺序初始化对成员顺序的

weixin_34262482的博客 395

C99/C11结构体初始化5种方法详解:从顺序初始化到指定初始化器实战

本文详细解析了C99/C11标准下结构体初始化的五种方法,包括顺序初始化、指定初始化器、复合字面量、部分初始化和清零初始化。通过对比表格和实战示例,帮助开发者在不同场景下选择最优方案,提升代码可读性和维护性,特别适合嵌入式开发和系统编程。

weixin_34343308的博客 419

C语言结构体初始化演进:从C99指定初始化器到C11复合字面量

结构体是C语言中组织复杂数据的核心机制,它通过将不同类型变量组合成单一实体,实现了数据的结构化封装。其初始化原理在于为每个成员赋予确定的初始值,以避免未定义行为。这一过程的技术价值在于提升代码的安全性、可读性和可维护性。在嵌入式系统、操作系统内核和网络协议栈等底层开发场景中,结构体初始化尤为关键。随着C语言标准演进,C99引入的指定初始化器允许按名赋值,解除了顺序依赖;而C11的复合字面量则支持匿名对象的动态创建。这些现代语法不仅减少了内存错误风险,还通过编译期常量初始化优化了性能,使开发者能更安全地处理设

weixin_34034670的博客 296

C语言结构体初始化进阶:从顺序初始化到C99指定初始化器与工程实践

结构体是C语言中组织复杂数据的核心机制,其初始化操作直接关系到程序的安全性、可维护性与性能。理解结构体初始化的原理,需要从内存布局与数据定义的基础概念入手。在C89/C90标准中,传统的顺序初始化方法虽然简单,但存在与成员定义顺序强耦合、可读性差等缺陷,容易引发未定义行为或逻辑错误。随着C99标准引入指定初始化器,开发者能够通过成员名显式赋值,彻底解除了初始化顺序的依赖,大幅提升了代码的健壮性和可读性。这一技术演进的价值在于,它使得初始化代码能够更好地适应结构体定义的变更,降低了维护成本,并促进了自文档化代

weixin_34245082的博客 349
上一篇: php垃圾收集机制
下一篇: 网络布线基础:交叉线和直连线区别
simonjay2007
博客等级 码龄17年 104粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值