声明(declaration)与定义(definition)
为了使不同的文件都可以访问同一个变量,C会区
分变量的声明和定义。
变量的定义会为这个变量分配存储空间,并且
可能
会为其指定一个初始化的值,
一个变量的定义有且 仅有一处。
定义实际上是一种特殊的声明。 变量的声明会将变量的类型和名称传达给程序。当 然。我们可以通过使用“extern”
关键字来声明一个 变量,而不用定义它。声明的形式就是在变量的名 字和类型前面,加上关键字“extern”
。
此处就得讲一下extern的用处了:
1、extern关键字用法一是用来声明一个变量的,告诉编译器我这个变量已经定义过了,但不一定在我这个声明前面,让编译器自己去找,如:
我在main函数后面定义的a变量,但是我能在main函数里使用a,而且打印结果是10,
2、 extern关键字用法二,用于声明在别的文件中已经定义好的变量,但是该变量不能是静态变量,通俗一点说就是,假设我有两个文件A和B,我在A文件中定义了变量sum,我想在B文件中使用,此时我可以在B文件中用extern声明一下sum,则可以用A文件中的变量sum
声明
告诉程序一个变量或者函数已经被定义,
不会分配空间
可以被声明多次
定义
分配变量的空间 只能定义一次
定义包含了声明,但是声明不包含定义,如
int a = 0; //定义并声明了变量 a
extern int a; //只是声明了有一个变量 a 存在,具体 a 在哪定义的,需要编译器编译的时候去找。
二、高级声明
typedef int *apple与#define peach int *
typedef是一种彻底的封装类型——在声明它之后不能 再往里面增加别的东西。
它和宏的区别体现在两个方面:
1、不能用其他类型说明符进行扩展。
unsigend apple j; //
这是非法的!
unsigned peach i; //
没问题,
i
是指向无符号整型变量的指针
2、在连续几个变量的 声明中,#define定义的类型不能 保证所有的变量为同种类型。
apple a, b; // a
和
b
都是指向整型变量的指针
peach c, d; // c
是整型变量指针,
d
是整型变量