WhyCan Forum

本站无需注册,无需积分,无需回复可下载所有资料,如果真的喜欢小站,请您注册之后请至少回复一个帖子激活Id,谢谢支持! 站长QQ: 516333132 (挖坑网/填坑网) admin@whycan.cn

您尚未登录。

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

mkseven32
会员
注册时间: 2018-04-24
累计积分: 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

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 6,471

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

感谢楼主分享!

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

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

离线

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

mango
会员
注册时间: 2017-12-02
累计积分: 231

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

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


歪朵拉开源硬件 https://widora.io/

离线

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

mkseven32
会员
注册时间: 2018-04-24
累计积分: 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

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

mark

离线

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

IoTer
会员
注册时间: 2019-01-20
累计积分: 25

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

涨新知识了!

离线

页脚