参考:http://t.csdnimg.cn/1xnzA
- 变量的定义:用于为变量分配存储空间,还可以为变量指定初始值,在程序中,变量有且仅有一个定义。
- 变量的声明:用于向程序表明变量的类型和名字。在程序中,变量可以声明多次。
- 定义也是声明:当定义变量的时候我们声明了它的类型和名字。
- 不定义变量的声明:通过使用关键字extern声明变量名而不定义它。“extern+对象类型+对象名”
- extern声明 不会为变量分配存储空间,只是说明变量定义在程序的其他地方。
- 有初始化式的声明必是定义
- 初始化式:int a = 10;
- 因为初始化式必须要有存储空间来进行初始化。
- 只有当声明也是定义时,声明才可以有初始化式,因为只有定义才会分配存储空间。
- 如果声明有初始化式,那么它可被当作是定义,即使声明标记为extern。extern int a = 10;但是只有当extern声明位于函数外部时,才可以被初始化。当初始化位于函数内部的extern声明时,编译器报错。
- 函数的声明和定义:带有{ }的就是定义,否则就是声明。
- extern double max(double d1,double d2); //声明
- 任何在多文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。
- 模块化要点:
- 模块即是一个.c文件和一个.h文件的结合,头文件.h中是对于该模块接口的声明。
- 某模块提供给其他模块调用的外部函数以及数据需要在.h文件中冠以extern关键字声明。可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量。
- 模块内的函数和全局变量需要在.c文件开头冠以static关键字声明;尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的。
- 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。
- 例外:以下三种实体的定义也可放到头文件中:
- 值在编译时就已知的const 变量的定义可以放到头文件中,如:const int num(10);
- inline 函数
- 类的定义可以放到头文件中
//如果声明有初始化式,它就被当作定义,即使它有extern
//只有extern声明位于在函数外面时,才可以被初始化。
//C语言中定义的变量默认就是extern的,因此 extern int a = 10; 等价于 int a = 10;
extern int a = 10; // 定义a为外部的整型变量int main(void)
{extern int a; //声明一个外部extern的整型变量// 这是个声明而不是定义,声明a是一个已经定义了的外部变量// 注意:声明外部变量时可以把变量类型去掉如:extern a;int b; // 定义一个变量, 不初始化int c = 10; // 定义一个变量, 同时进行初始化extern int d = 10; //这个定义很明显被gcc编译器认为是错误的。//'d' has both 'extern' and initializerreturn 0;
}