变量函数的申明和定义----extern和static

定义和申明全局变量和函数

定义在C文件中,变量定义后要初始化。申明在头文件中进行外部声明(extern),定义的C文件中也要包含申明的头文件,以便编译器检查变量的定义与申明的一致性。此时外部文件需要用到该全局变量只需要包含头文件就可以了。

模块化要点

  1. 一个模块包含一个.c文件和一个.h文件,头文件是对该模块接口的申明。
  2. 某个模块要提供给其他模块调用的函数和变量,需要在头文件中做extern关键字申明。
  3. 模块内的函数和全局变量需要在.c文件头部用static申明。
  4. 永远不要在.h文件中定义变量!这样容易导致重复定义错误。

    定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。

函数申明

外部模块调用函数申明没有必要加extern,因为函数申明默认就是加extern的;

内部模块调用申明是因为函数定义在调用函数之后,在C语言中,编译一个C语言源文件是从第一行开始扫描到最后的,你调用一个函数,之前必须定义或申明过这个函数。

main函数定义

错误用法

void main()

正确用法

int main(int *argc, char *argv[]) 或者int main(void)  或者int main()

Static修饰变量,修饰全局变量时,该变量只在定义该变量的源文件中有效,其他文件不能使用。Static全局变量也只初始化一次。

修饰局部变量时,静态局部变量的生存期改变了。局部变量只初始化一次,下一次根据上一次结果值。Static变量存储在静态存储区,它具备持久性和默认值0

Static修饰函数时,限制了函数的可见性。被static修饰的函数只能在定义的文件内访问。在其他文件中访问此函数时,会造成undefined reference(找不到函数)的错误。


版权声明:本文为hfutrlj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。