Tips:
定义:表示创建变量或分配存储单元
声明:说明变量的性质,但并不分配存储单元
extern int i; //是声明,不是定义,没有分配内存int i; //是定义如果在声明的时候给变量赋值,那么就和去掉extern直接定义变量赋值是等价的
extern int a = 10;//尽量不要写这种定义方式int a = 10;//上述两条语句等价
(注意上面的不同语句对声明和定义的区分,对源文件中的局部变量来说是成立的(也就是.c文件),而对于源文件中的全局变量(外部变量)int a和在头文件中的int a就不能用上面的语句来解释声明和定义的区别)
补充:定义和声明的一个小坑,对于int a;来说,在源文件中,如果是全局变量的话就是声明,如果是局部变量的话就是定义
全局变量:
文章前面提到过一句话:如果在所有函数之外定义的变量没有指定其存储类别,那么它就是一个外部变量,意思就是这里的int a;等价于extern int a;相当于声明,声明是可以多次的
局部变量:
文章中只提到了extern(外部变量),这里补充下auto(自动变量),由于auto(自动变量)极为常用,所以C语言把它设计成缺省的存储类型,即auto 可以省略不写,在main函数内部的变量int a也是局部变量,
相当于auto int a;相当于定义,定义只能一次