深入淺出C語言(3)----聲明與定義

聲明的存在意義是告訴編譯器有這個東西,不佔用存儲空間,而定義則是要實實在在的,是需要佔用存儲空間的。

示例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++;
}

 

綜上所述:聲明的主要目的是告訴編譯器有這個東西,編譯器在沒有遇到所聲明東西的具體定義之前也充許代碼先使用,等到後緒的時候再補上即可。因此聲明的代碼是不被編譯到真正的執行的二進制代碼中去的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章