c語言的標頭檔案 不是c 類的標頭檔案

2022-10-11 14:18:14 字數 3146 閱讀 4916

下面的概述是參考的這篇文章:

c語言程式設計中也有,也需要標頭檔案,

標頭檔案不只是c++的類才需要!

比如: c中的string.h,  記憶體操作的標頭檔案 #include

即是: c語言中, 函式/變數的宣告和實現, 也可以像c++一樣,

標頭檔案中, 哪些函式/變數需要使用extern來說明?

c語言有乙個約定: 凡是在對應的.c檔案中, 有那個函式的實現的, 就不加extern, 凡是沒有對應實現的, 就需要加extern.

extern的解決,相當於乙個口頭承諾, 乙個口頭約定, 口頭答應,  在linker連線時, 由聯結器(鏈結器)自動去找.不用我們去管的!!

exten的標頭檔案如何區分"定義宣告" - "引用宣告"?

(引用自: )

兩種方式:

1. 頂層宣告中,存在初始化語句是,表示這個宣告是定義宣告,其他宣告是引用宣告。c語言的所有檔案之中,只能有乙個定義宣告。按照這個模型,我們可以在first.h中定義如下tpye g_test=1;那麼就確定在first中的是定義宣告,在其他的所有宣告都是引用宣告。

2、省略儲存型別說明

在這個模型中,所有引用宣告要顯式的包括儲存類extern,而每個外部變數的唯一定義宣告中省略儲存類說明符。

c語言中 陣列並沒有和char*  指標完全等同起來:

int g_glob[100];

在另乙個檔案中引用宣告如下:

int * g_glob; // 這個錯誤!

在vc中,是可以編譯通過的,這種情況大家都比較模糊並且需要注意,陣列與指標類似,但並不等於說對陣列的宣告起變數就是指標。上面所說的的程式在執行時發現了問題,在引用宣告的那個檔案中,使用這個指標時總是提示記憶體訪問錯誤,原來我們的連線程式並不把指標與陣列等同,int g_glob[100];

並且最好再加上乙個extern,更加明了。

extern int g_glob[100]; 或者: extern int g_glob;  引用宣告不需要分配記憶體, 所以不需要指明陣列大小.

c語言程式在記憶體中的儲存區域:

**區;

常量區;

全域性/靜態(變數)區;

堆區/自由儲存區: malloc, free | new, delete

棧區(是一段公共記憶體區, 公共的: 是指所有的函式執行時,都是使用的這個區域, 這個區域被反覆的使用,

前乙個函式使用後, 退出時, "函式內的棧區被釋放", 什麼叫釋放, 並沒有記憶體清零這個動作,只是棧區

函式執行時留下的值, 這個值的型別是各種各樣的...但是由於位元組數的長度不同, 所以組合起來的值,完全

不可控, 所以是隨機的, 需要對其進行初始化)

關於函式的返回值問題?

返回值無非有兩種: 一是返回位址的, 比如陣列位址, 指標, 物件的位址, 也就是, 一般"非內部資料型別"

的返回值,最好用返回引用的方式;

另一種是返回拷貝傳值型別的, 一般, 返回的是"內部/基本"資料型別的,用這個傳值, 不要用傳引用.

那麼, 對於傳值的函式 的返回值, 函式退出時, 其記憶體被**, 也就是,程式無法引用得到, 那麼這個值怎麼傳出來呢?

網上的說法, 我比較相信的一種是: "函式退出 時,將返回值拷貝到" eax" 這個cpu內的暫存器中,後面的函式,你要

這個返回值, 你就去取, 你不要就算了, 但是過後的話,你就取不到,因為這個暫存器隨時都可能被覆蓋.

const 修飾函式?

修飾函式的返回值 const one_class_type * foo(..) , 表示這個函式的返回值是乙個常量指標, 因此它的

返回值只能付給 同型別的const 指標變數, 不能付給非const的.. 因為要強制保證const變數的值不被

直接/甚至修改!

const修飾類的成員函式的動作: 這時const要放在函式的最後: type foo(...) const , 它表示, foo函式不能修改它之外的成員變數, 但可以引用/呼叫外部的成員變數, 但是不能呼叫非const的成員函式.

sizeof 和 strlen 的列出幾個重要的區別:

1.sizeof是算符,strlen是函式。

2.sizeof可以用型別做引數(必須加括號)/普通變數,strlen只能用char*做引數,且必須是以''/0''結尾的。

sizeof還可以用函式做引數,比如:

short f();

printf("%d/n", sizeof(f()));

輸出的結果是sizeof(short),即2。

3.strlen計算的是字串的長度,sizeof計算的是變數使用的記憶體大小,不受裡面儲存的內容改變

4.strlen的結果要在執行的時候才能計算出來,時用來計算字串的長度,不是型別佔記憶體的大小。

5.sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。這是因為sizeof是個操作符不是個函式。

6.當適用了於乙個結構型別時或變數, sizeof 返回實際的大小, 當適用一靜態地空間陣列, sizeof歸還全部陣列的尺寸。 sizeof 操作符不能返回動態地被分派了的陣列或外部的陣列的尺寸 。

6.陣列作為引數傳給函式時傳的是指標而不是陣列fun(char [8])

fun(char )

都等價於 fun(char *)

在c++裡引數傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小

如果想在函式內知道陣列的大小, 需要這樣做:

進入函式後用memcpy拷貝出來,長度由另乙個形參傳進去

fun(unsiged char *p1, int len)

我們能常在用到 sizeof 和 strlen 的時候,通常是計算字串陣列的長度

C 標頭檔案與C語言標頭檔案的區別

c 標頭檔案與c語言標頭檔案的區別 c語言風格的標頭檔案 帶.h include 輸入 輸出函式 include 字串處理 include 雜項函式 記憶體分配 c 風格的標頭檔案 無.h include 資料流輸入輸出 include 字串類 include stl佇列容器 當c 需要包含c的標頭...

C語言的標頭檔案

1.在c檔案中在函式外部宣告變數,稱為為全域性變數。1 全域性變數如果加static關鍵字,表示只能在本檔案內訪問,而且只能從宣告處到檔案末尾的範圍內訪問。宣告時如果沒有初始化,會自動初始化乙個值,例如static int x,x預設值為0。如果a 函式中用到變數x,而x的定義 static int...

C語言的標頭檔案

標頭檔案 a.h ifndef a h define a h 定義方法,不提供實現 int add int a,int b endif add.c include a.h 實現標頭檔案a中定義的方法 int add int a,int b main.c include include a.h 若想在...