(1)把xxx的定义,放在了使用它的语句下面,引起的错误。
良好的编程习惯是,如果变量的定义和使用处于同一文件,就要先定义后使用,且定义语句要放在使用的前面。所以最好将定义放在头文件里,再引用头文件即可。
(2)没有引用相关头文件
(3)真的没有定义
(4)定义在其他c文件时,要用extern定义
代码如下,会报错:
static struct i2c_cilent cx20921;
static const struct i2c_cilent cx20921 =
{
.addr = DRIVER_ADDR,
.name = "cx20921",
.timeout = 10000;
};
第一行已经定义了一个cx20921,再定义一个const类型的就重复了,删掉const即可。
如果需要定义为const,将第一行声明删除,因为声明和定义的类型不一致会出错。
结构体的变量引用有以下2种规则:结构体变量是指针类型时,需用符号“结构体变量名->成员名”引用,不是指针类型时就用符号“结构体变量名.成员名”引用。
因为我在定义结构体成员时,用的是指针类型,所以上面初始化时用“.”引用显然是错误的。
函数参数是指针类型,传入是变量,出错,在变量前加&,传入变量地址即可。
由非const的变成const不用显式的转换,const变为非const需要显式转换,这种情况应当使用显式的类型转换。
我定义的const变量和使用代码
static const struct i2c_cilent xxx = {省略};
static i2c_cilent *client = &xxx;
原因是类型检查更严格了,不同类型之间,都必须加强制类型转换,const类型不能把地址赋值给变量,必须强制转换成同类型的。
因为本身const的作用就是防止数据被修改,所以传递该地址给别的变量就容易被修改,编译器这里帮助处理,告诉用户如果需要传地址就必然需要强转类型。
这里有两种解决方式,可以让程序不报错:
(1)、把结构体定义前的const去掉,但这个不能满足最初的需求。(符合规范)
(2)、保留const,在使用时用显示类型转换。(不推荐这种用法)
(1)、函数指针初始化,可以直接用函数名称赋值。
(1)、短类型赋值给长类型不用强转。(编译器默认将短类型强转为长类型)
unsigned short -> int
unsigned char -> int
(2)、2.有类型赋值给无类型
struct i2c_data * -> void *
(3)、同类型的指针
(4)、非const类型赋值给const类型
char * -> const char * dest
(1)、无类型赋值给有类型。(方便指定类型,便于计算)
void * -> struct i2c_data *
struct i2c_data *i2c = (struct i2c_data *)pd; //示例
(2)、无符号类型赋值给有符号类型
unsigned char * -> char *
char *buf = (char *)buf; //示例
(3)、当遇到const时,有符号类型赋值给无符号类型
char * -> unsigned char *
unsigned char *buf = (char *)buf; //编译器将自动转换成无符号的
unsigned char *buf = (unsigned char *)buf; //手动转换
(4)、const类型赋值给非const类型
(5)、长类型赋值给短类型,需要强制转换
按照语法,右边转换为左边的类型,这里不强转应该没有错,但是保险起见还是强转一次
C语言规定字符型和整型数据之间可以通用,所以解答了为什么上面短类型赋值给长类型不需要强制转换的结论了。
赋值时,一律是右部值转换为左部类型
函数参数是表达式,当参数传给函数时,也发生类型转换,所以函数参数通常用长类型来存储短类型,帮助提高计算精度,如果只是做判断,写成同类型即可。
int可被自动转换成unsigned int,反过来必须要强制转换。
结构体是指针类型,所以引用其成员时必须用“->”符号
这里传入的是 “ xxx * ” 指针类型,而函数定义的参数类型为 “ struct xxx *” ,所以报错,类型名字不统一。
该接口没声明定义,添加头文件,或者添加定义和声明
假如函数定义只有三个参数,调用时却给了四个参数,就会报错
为非指针类型结构体,却用了->来引用成员,就会出错,应该用英文点号引用
函数声明和定义的参数及类型不一致,就会报错
需要包含
#include “freertos/task.h”
意思是在包含task.h之前需要先包含FreeRTOS.h,那就把#include "freertos/FreeRTOS.h"写在前面。
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
需要包含
#include “freertos/timers.h”
需要包含
#include “freertos/queue.h”
下面这种写法引起的警告
int i =0;
for(i = 0; i < 5; i ++)
{
;
}
修改为下列方式
for(int i= 0; i < 5; i ++)
{
;
}
表示aa_bb这个函数接口名重复了,分别位于mm.c和xx.c文件