對static extern和檔案包含的理解1

2021-06-12 17:44:44 字數 3500 閱讀 7403

首先看一下目錄結構

執行結果:

解釋:

(一)        #include "cs2/p1.h",其中cs2/p.h 是相對於main.c來說的,因為main.c中呼叫了p1.c中的函式fun1。

(二)        因為main.c呼叫了printf(),所以main.c需要包含標頭檔案stdio.h;

(三)        extern void fun1(void);  之所以要加extern的原因,因為fun1將來是要被其他 .c 檔案呼叫的(即fun1是提供給外界的介面),其他 .c 檔案要包含p1.h ,這樣在編譯呼叫fun1的其他 .c 檔案時編譯器根據extern就知道函式fun1已經在其他地方定義過了,很明顯已經在p1.c中定義了。extern 只是給其他 .c 檔案看的,而不是給p1.c看的,但是如果在p1.h中定義了某個用extern修飾的函式,並且其他的.c檔案呼叫了該函式,則必須在p1.c中將其實現。還應該知道的是,如果在p1.c和p1.h中定義了很多函式,但是並沒有沒其他.c檔案呼叫,則定義的那些函式並不參加編譯。

(四)        如果p1.h中只含有用extern修飾的變數或者函式,那麼p1.c  的開頭就不用寫 #include「p1.h」,原因很明確,extern只是給其他 .c 檔案看的。在p1.h中宣告的extern修飾的函式和變數,必須都在p1.c中實現。並且這也是標頭檔案的書寫規範。

(五)        假如p1.h中除了用extern修飾的變數和函式外,還有其他的內容,比如 p1.c 中用到的巨集定義、typedef……、因為p1.c用到了,所以此時p1.c必須包含p1.h,即p1.c中必須有#include」p1.h」 。

(六)        在p1.c中函式定義時就不用再在前面加extern了,extern是給其他 .c 檔案看的。

(七)        #ifndef __p1_h__

#define __p1_h__

……

#endif

的目的是防止標頭檔案重複包含。

(八)        為什麼fun2()沒有在p1.h中宣告?因為函式fun2只是給p1.c用的,而不是給其他 .c 檔案用的。這裡fun2 的內容比較少,如果要處理的問題比較複雜,要進行功能拆分,可能在 p1.c 中還要定義許多小的函式,但是這些小的函式只是給p1.c中的某些函式呼叫的。注意:在p1.h中用extern修飾的函式用給其他 .c 檔案用的,是提供給外界的「介面「,而fun2只是p1.c內部使用,不提供給外界。這也是為什麼要在fun2的前面用static修飾的原因!通過static,可以知道fun2()只能在p1.c中使用,即只能被書寫在p1.c檔案中的函式呼叫。同理fun3跟fun2含義一樣。

(九)        為什麼fun2直接就定義了,而fun3先宣告一下,然後再在後面定義?  原因:  可以清楚地看到,函式fun1呼叫了fun2和fun3,fun2在fun1的前面直接定義了,那麼fun1就可以直接呼叫了,如果將static fun3(void);去掉,編譯會出現問題,原因是fun3是在fun1的後面定義的,並且在fun1前面沒有宣告,我們可以想象一下在 main.c 檔案中編寫乙個函式時,不是也有兩種方式嗎?第一種是在main函式前面直接定義,第二種方法是現在main函式前面先宣告,然後再在main函式後面定義。

static extern分析總結

一 c語言記憶體空間布局 下面是google上找的一張c記憶體布局圖,我先基於這張圖介紹下各個記憶體區域的情況 1 正文 段 每個程式開始前,都有系統載入 指令到這裡,用於執行,當然都是機器碼 2 初始化的資料段 存放已經初始化的非自動變數,如全域性變數int i 0 等等 3 未初始化的資料段 b...

看書雜記 static extern

一 函式中的區域性變數都是動態分配儲存空間的,資料儲存在動態儲存區中,函式呼叫結束後即消失,釋放儲存空間。若是希望函式中的區域性變數在呼叫結束後仍保留原值,也不釋放儲存單元,則可使用關鍵字static宣告區域性變數是靜態變數。函式編譯時在靜態儲存區分配儲存單元,函式呼叫結束後不釋放儲存單元,直到程式...

static,extern詳細用法

static c語言 static 的作用 1 全域性靜態變數 1 在全域性靜態區分配記憶體 2 如果沒有初始化,其預設值是0 3改變量在本檔案內從定義開始到檔案結束可見 2 區域性靜態變數 1 改變量在全域性靜態區分配記憶體 2 如果不顯示初始化,那麼將被初始化為0 3 它始終在全域性靜態區,直到...