变量重复包含问题
编译错误:
(E) E0562300 E0562300:Duplicate symbol “_flag20ms” in “DefaultBuild\r_cg_main.obj” LCD.mtpj
解释:
头文件里面放的是关于函数,变量,类的“声明”。记着,是“声明”,不是“定义”。所以,最好不要在头文件里定义什么东西。如果进行了定义,在头文件的包含中,会多次进行变量的定义。
相关知识:
头文件中变量如果没有初始化就是声明;初始化了就是定义,此时被包含之后会发生重复定义的错误。全局变量的定义宜放在某个 .c 文件中,而 .h 文件里写的是变量的声明。头文件应用于声明而不是用于定义。
其实,C++标准并没有规定头文件中不能定义 变量,只不过如果在头文件中定义变量,而该头文件又被多次包含的话,会造成变量的重新定义。这和头文件中的函数声明不同,因为函数在头文件中仅仅是声明,声明可以有多个,但是无论是函数还是变量定义都只能有一个,否则就会发生重复定义的错误。
更多资料:
传送门1
传送门2
摘要:
1、声明可以多次,定义只能一次
2、全局变量在外部使用声明时,extern关键词是必须的。
3、局部变量的声明不能有extern的修饰,且局部变量在运行时才在堆栈部分分配内存
4、头文件主要是给人看的。在头文件定义全局变量时,虽然有#ifndef的条件编译,能保证你的头文件只被引用一次,不过也许还是会岔子。因为宏名有效范围仅限于本c源文件,所以在这多个c文件编译时是不会出错的,但在链接时就会报错,说你多处定义了同一个变量。
5、extern
extern int a;//声明一个全局变量a
int a; //定义一个全局变量a
extern int a =0 ;//定义一个全局变量a 并给初值。
int a =0;//定义一个全局变量a,并给初值,
不管是int a;还是extern int a=0;还是int a=0;都只能出现一次,而那个extern int a可以出现很多次。当你要引用一个全局变量的时候,你就要声明,extern int a;这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。
函数定义和声明时都可以将extern省略掉
6、尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的。