声明的存在意义是告诉编译器有这个东西,不占用存储空间,而定义则是要实实在在的,是需要占用存储空间的。
示例1:
我们先声明一个结构体,如下:
Struct student{
int num;
Char name[20];
};
这是一个声明,不占用任何存储空间。
Struct student a; //这是一个定义了
当编译器扫描到这句的时候,首先看到struct student,编译会找这个struct student的所声明的形式,然后根据前面我们所声明的结构体给a分配相应的存储空间。
示例2:
//file main.c
void main()
{
test();
}
void test()
{
}
编译器是从上到下扫描源代码的,当扫描到main函数中的 test()的时候,编译器这个时候会傻了,因为前面它没有见过这个函数。这个时候编译器会报错,说找不到test()的定义。
咋办呢??我们在调用test()之前告诉编译器有这个东西。也就是我们所说的声明。
一般我们习惯这样写:
//file main.c
void test(); //这里是声明,告诉编译器当前的.c文件有这个东西,
void main()
{
test();
}
void test()
{
}
其实,我们也可以这样写:
//file main.c
void main()
{
void test(); //这里是声明,最终的代码中没有这句code
test(); //实实在在的调用,最终的代码中是有这句code
}
/*这里是定义,最终的代码中是会存在这个函数的*/
void test()
{
}
示例3:
//file hello.c
void test()
{
}
//file main.c
extern void test(); //声明,加上extern,就是告诉编译器test函数不在当前.c中,而是在其他的.c中,编译器遇到的时候,
//先不要报错,具体在链接的时候,再找这个test()函数的具体实现.
void main()
{
test();
}
示例4:
//hello.c
int a = 0; //一个全局变量,在程序的全局区
//main.c
void main()
{
extern int a ; //告诉编译器a的声明不在当前的.c中,而是在其他的.c中
a++;
}
综上所述:声明的主要目的是告诉编译器有这个东西,编译器在没有遇到所声明东西的具体定义之前也充许代码先使用,等到后绪的时候再补上即可。因此声明的代码是不被编译到真正的执行的二进制代码中去的。