您尚未登录。

楼主 #1 2018-05-08 09:58:03

mkseven32
会员
注册时间: 2018-04-24
已发帖子: 57
积分: 57

又get 到新技能----C99 标准中结构体初始化

ESP-ADF 的例程中采用了pipeline 的设计模式(就是管道)。

具体还没搞清楚它的原理,相关链接如下,据说蕴藏着一种强大的哲学思想,后面有机会慢慢学习

https://blog.csdn.net/yanghua_kobe/article/details/7561016

https://coolshell.cn/articles/1351.html

下面说说 在看源码的时候,发现一个疑惑的点 “.”   对就是结构体初始化的问题~~~~

在ESP-ADF 的例程中充满了大量 的结构体初始化赋值。 如下:

一个结构体 采用一个宏的初始化方法, 这样看起来简洁 易懂~~~但是深究下去就有点奇怪了

i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_DEFAULT();

结构体定义

typedef struct {
    audio_stream_type_t     type;               /*!< Type of stream */
    i2s_config_t            i2s_config;         /*!< I2S driver configurations */
    i2s_pin_config_t        i2s_pin_config;     /*!< I2S driver hardware pin configurations */
    i2s_port_t              i2s_port;           /*!< I2S driver hardware port */
} i2s_stream_cfg_t;

宏定义

#define I2S_STREAM_CFG_DEFAULT() {                                              \
    .type = AUDIO_STREAM_WRITER,                                                \
    .i2s_config = {                                                             \
        .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX,                    \
        .sample_rate = 44100,                                                   \
        .bits_per_sample = 16,                                                  \
        .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,                           \
        .communication_format = I2S_COMM_FORMAT_I2S,                            \
        .dma_buf_count = 3,                                                     \
        .dma_buf_len = 300,                                                     \
        .use_apll = 1,                                                          \
        .intr_alloc_flags = ESP_INTR_FLAG_LEVEL2,                               \
    },                                                                          \
    .i2s_pin_config = {                                                         \
        .bck_io_num = IIS_SCLK,                                                 \
        .ws_io_num = IIS_LCLK,                                                  \
        .data_out_num = IIS_DSIN,                                               \
        .data_in_num = IIS_DOUT,                                                \
    },                                                                          \
    .i2s_port = 0,                                                              \
}

自己C语言功底一般,从来没见过这种“.” 的赋值方式~~~,群里问了一下大牛们,大牛说看看C99标准吧~~~~

这种结构体的初始化是C99标准中定义的。 目前了解到的 这样初始化的作用是:
1. 可以不用按顺序对结构体的小项进行初始化
2. 可以选择性的对结构体小项进行初始化

相关连接:
http://blog.chinaaet.com/jihceng0622/p/37285

离线

#2 2018-05-08 10:21:27

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,348
积分: 9202

Re: 又get 到新技能----C99 标准中结构体初始化

感谢楼主分享!

还有这个: 装个VC2017试一试, 看看对C99的变长数组(柔性数组,零长数组)支持如何?

有些开源项目(如littevgl)大量用到变长数组(即用变量作为数组初始化长度),
用VC根本就编译通不过,
只能借道mingw: 一步一步分享在Windows QtCreator/Mingw平台编译运行调试LittleVGL





离线

#3 2018-05-08 12:12:17

mango
会员
所在地: 芒果派1
注册时间: 2017-12-02
已发帖子: 780
积分: 726

Re: 又get 到新技能----C99 标准中结构体初始化

linux驱动中叫:标记化结构体赋值法,特别常用






歪朵拉开源硬件: https://widora.cn
淘宝:  https://widora.taobao.com/

离线

楼主 #4 2018-05-08 16:14:44

mkseven32
会员
注册时间: 2018-04-24
已发帖子: 57
积分: 57

Re: 又get 到新技能----C99 标准中结构体初始化

晕哥 说:

感谢楼主分享!

还有这个: 装个VC2017试一试, 看看对C99的变长数组(柔性数组,零长数组)支持如何?

有些开源项目(如littevgl)大量用到变长数组(即用变量作为数组初始化长度),
用VC根本就编译通不过,
只能借道mingw: 一步一步分享在Windows QtCreator/Mingw平台编译运行调试LittleVGL

感觉晕哥 无所不能啊!!!

离线

#5 2019-03-10 11:06:51

tink
会员
注册时间: 2019-03-09
已发帖子: 32
积分: 32

Re: 又get 到新技能----C99 标准中结构体初始化

mark

离线

#6 2019-03-18 08:09:20

IoTer
会员
注册时间: 2019-01-20
已发帖子: 25
积分: 25

Re: 又get 到新技能----C99 标准中结构体初始化

涨新知识了!

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn