从一段代码看include的妙用以及C99的新式结构体初始化
前言
本文将以恒玄公司提供的某款蓝牙降噪方案中的代码片段做实际例子,对include的妙用和C99标准新添的结构初始化方法进行介绍。
代码实例
#define FIR_COEF_NUM 384
typedef struct {
int8_t gain0;
int8_t gain1;
int16_t len;
int16_t coef[FIR_COEF_NUM];
} FIR_CFG_T;
const FIR_CFG_T audio_eq_fir_cfg = {
.gain0 = 6,
.gain1 = 6,
.len = 128,
.coef = {
#include "res/eq/EQ_COEF.txt"
}
};
include的妙用
include用于将指定头文件嵌入源文件中,如大家最熟悉的#include<stdio.h>语句的目的就是讲C语言的标准输入输出头文件嵌入到当前代码中。事实上,include的使用不限制文件类型,也就是说,我们不仅可以将头文件嵌入到源代码中,也可以将部分源代码嵌入到源代码中,甚至还能将数据嵌入到源代码中!
在上述代码中,coef是一个数组,用于存放一些配置参数。EQ_COEF.txt文件的部分内容如下:
0x7FFF,
0,
0,
0,
0,
0,
0,
可以看出,EQ_COEF.txt文件被include之后,效果等同于代码:
.coef = {
0x7FFF,0,0,0,0,0,0,
}
这样做的好处是:可以在不修改源代码的条件下,仅对EQ_COEF.txt文件做修改,便可更改我们需要的配置。如果EQ_COEF.txt是由其他程序生成的,我们也不必频繁的复制粘贴即可更改配置。
C语言结构体初始化方法
C89中结构体的初始化
以结构体Student举例:
struct Student{
int id;
int age;
float score;
};
1定义时赋值
struct Student stu1 = {1001,12,90};
注意:这种方法需要将赋值与定义的项按顺序一一对应,不能在中间漏写。
2.定义后赋值
struct Student stu1;
stu1.id = 1001;
stu1.age = 12;
stu1.score = 90;
C99中新增的结构体的初始化方法
同样以结构体Student为例:
struct Student stu1={
.id = 1001,
.score = 90,
.age = 12
};
该方法需要在想要赋值的字段前加一个半角的点,赋值后以半角的逗号结尾,最后一项不必加逗号。
这种方式的好处是可以不按照结构体申明的顺序来赋值,方便我们将同类型的字段放到一起便于读写。