聲明的存在意義是告訴編譯器有這個東西,不佔用存儲空間,而定義則是要實實在在的,是需要佔用存儲空間的。
示例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++;
}
綜上所述:聲明的主要目的是告訴編譯器有這個東西,編譯器在沒有遇到所聲明東西的具體定義之前也充許代碼先使用,等到後緒的時候再補上即可。因此聲明的代碼是不被編譯到真正的執行的二進制代碼中去的。