當前位置:首頁 » 電腦資訊 » 為什麼頭文件只聲明不定義

為什麼頭文件只聲明不定義

發布時間: 2022-05-02 09:53:43

Ⅰ c++頭文件里只有函數聲明沒有函數定義為什麼能運行怎樣做自己的頭文件

庫文件的實現都在c++運行庫里,可能是靜態鏈接或者動態庫

Ⅱ c語言 中 為什麼不將全局變數的定義放在頭文件中

首先要說明什麼是全局變數,c語言中全局變數一般是指定義在函數體外的變數。全局變數按可訪問性可分為外部變數內部變數

內部變數是指使用了static關鍵字修飾的全局變數,它的可訪問范圍(作用域)被限定在本源文件所在的鏈接文件模塊中,不能被其它文件模塊引用。反之沒有被static關鍵字修飾的全局變數則是外部變數,其它文件模塊可以通過extern關鍵字引用該全局變數並訪問。

要說明的是全局變數無論是內部變數還是外部變數,的存儲類別都是靜態的,也就是放到靜態內存區域中,它編譯鏈接階段就已經分配好了固定的內存。

搞清楚上面的內容,就很容易得出若把全局變數放在頭文件會有哪些問題;

一 對內部變數來說,每個include該頭文件的文件模塊中都會單獨為這個內部變數分配靜態內存空間,這個空間是相對獨立的,是一種空間浪費,同時還失去了全局變數訪問一致性的特點,實在沒有什麼意義。如果這個頭文件只被一個模塊使用,對於這個文件模塊來說應該沒啥問題。

二 對外部變數來講,這個頭文件被多個文件模塊include的情況下,鏈接過程會報錯,因為符號沖突,所有include這個頭文件的模塊都會有這個全局符號。在這個頭文件僅僅只被一個模塊include的時候可以正常使用。

經上分析得出要避免全局變數定義在頭文件中,因為當這個頭文件被多方include的時候會產生一些不必要的麻煩,就這么多。

全局變數作用域范圍較廣,被錯誤修改後排查定位問題比較困難,若非必要盡少使用。

下面說一下比較好的方式就是全局變數只定義在實現文件(.c,.m)中,對內部變數沒啥說的它只在文件模塊內部使用,對外部變數可以在該模塊頭文件中使用extern關鍵字修飾一下,這樣其它文件模塊只要直接include該頭文件就可以使用模塊中的外部變數了。

Ⅲ linux下明明包含了函數聲明的頭文件,為什麼還顯示沒有定義的參數

你編譯的時候要把源文件也一起編譯;
比如自己定義了個sum.cpp sum.h
在main.cpp中調用,實際上是main調用了sum的庫,所以要確保這個庫存在,因此sum.cpp是需要編譯生成對應庫的,如果不去指定就什麼都沒有
所以要這樣 g++ main.cpp sum.cpp;
不能只編譯main.cpp。

Ⅳ C++書上寫的是不能把變數定義在頭文件中,頭文件只能用來聲明,為什麼MFC中把變數都定義在頭文件中

那隻是建議,並不是絕對的
通常情況頭文件是只存放聲明,而.cpp文件存放定義
但也有例外,比如模板類。

如果頭文件中存放變數的定義,而其他多個cpp文件包含了這個頭文件,可能會導致該變數被重復定義而出現鏈接錯誤

Ⅳ 為什麼VC的頭文件裡面的函數只有聲明卻沒有定義

定義是有的,有一些定義被編譯成了二進制碼了,在頭文件中應該可以看到預處理把這些文件包含進去了,就像你要靜態調用dll文件就要用預處理把lib文件包含進去一樣,至於各個函數的功能,如果是純運算的那就是編譯器的製作者寫的,如果是對文件讀寫,創建窗口,這些就是調用了API函數

Ⅵ C++調用類頭文件為什麼只需要include聲明部分而不需要類的定義部分

你這個問題問得好。

這牽扯到C++語言從編寫-->執行整個過程。一般來講,開發一個C++程序需要經過以下幾步
1. 編寫代碼,
2. 編譯器進行編譯,compile
3. 編譯器進行連接。
4. 執行。

由於C++語言支持多文件工程。需要經過編譯和連接的過程。
打個比方,你要建造一架飛機,需要發動機,機翼,機身,尾翼,起落架。你可以把這幾個部分交給專門的廠商去製作,這就是編譯過程。這么多零件交給你,你只需要組裝起來就可以了,這就是連接過程。
編譯器(比如VC)就是加工零件的工廠,通過編譯器的源代碼會變成目標文件,也就是零件,VC生成的是.obj文件。
連接器(比如VC下的link)就是組裝工廠,它能把所有的零件組裝成你需要的東西。

好了,搞懂了編譯器和連接器,我們再來看頭文件.h和實現文件.cpp的作用。
還是拿飛機舉例子。機身和機翼是必須連接起來的,但是他們之間怎麼連接呢?製作機翼的只會做機翼,製作機身的也只會製作機身。那麼作為組裝工廠的你就會提供給他們一份飛機的介面設計圖,圖紙裡面詳細描述了機翼和機身怎麼連接,但並不描述機翼和機身應該怎麼去製作。那些零件工廠拿到結構圖紙以後,就知道了,原來機翼是被安放在機身的這個地方,嗯,而且規定了用鉚釘(打個比方)連接。好了,我知道了。可以做了,作為機翼製造商,我不用關心機身是怎麼做的,我只關心機翼的製作和與機身的介面。換到C++這邊來,這個用來描述介面的設計圖就是.h文件,也就是頭文件。具體機翼的實現也就相當於.cpp文件了。

所以,在程序中只需要應用頭文件,也就是只需要知道介面的設計圖。等你根據介面設計圖設計好了零件,交給組裝工廠,組裝工廠(也就是連接器)會把所有的零件(編譯器編譯.cpp生成的.obj)連接起來,這樣飛機就可以翱翔天空了。

Ⅶ 既然預編譯只是起一個聲明的作用,為什麼不在工程中每個c文件中包含所有的頭文件呢這樣不是很方便么

預編譯的時候會把包含的頭文件展開,即把頭文件裡面的內容展開在當前文件中,如果包含所有頭文件,第一會很占空間,因為有些頭文件裡面的變數(比如有很大的數組或者什麼的)在當前這個文件並沒有用到;其次很耗時間,因為要一個個去展開;第三,撇開時間和空間消耗不說,可能會存在不同頭文件中聲明或者定義了同名變數,這樣在編譯的時候就會報錯。但是你卻很難找到錯誤,因為頭文件裡面的東西你看不見,其次還可能引起一個重復包含的問題,比如頭文件A.h包含了B.h,你在當前.c文件中如果#include"A.h" 後又#include"B.h" 的時候就會報錯了,因為你重復包含了,當然重復包含可以通過#ifdef#endif機制解決。但是你不能保證每個頭文件中都做了這樣的操作。

Ⅷ class 類名;為什麼添加頭文件不可以,只可以提前聲明,是不是mfc架構有什麼特別注意的地方!

在使用這個類之前必須包含頭文件,這個頭文件必須在定義類對象的類所在頭文件裡面,而不是cpp文件中包含,在第一個類中加了class 另一個類的名的情況下,必須在cpp文件中包含該類聲明的頭文件。

Ⅸ C語言里有時候頭文件光是聲明了函數卻沒有定義函數,為啥就能用那

頭文件的函數的實現文件都在其他文件中,比如VC++就是在那些.LIB和.DLL文件中。這樣可以把實現文件轉化為LIB和DLL,就可以保護你的源代碼。而只留出來頭文件,給別人看,別人用頭文件作為介面,調用LIB或者DLL中的函數。

Ⅹ 為什麼頭文件里已經包含了函數的聲明,調用還要聲明

定義只能有一次,而聲明的次數不限。任何標識符在使用前至少要有聲明,將聲明放在頭文件中,就可以在需要使用到標識符時隨時把頭文件包含進來即可。如果把定義放進頭文件中,那每包含一次頭文件,標識符就定義了一次,這樣在多文件的編譯連接時很容易出問題的。 包含其實就相當於把被包含文件的內容加入到其中,和用被包含文件中的內容替換掉對應的包含語句沒有區別。使用頭文件的好處就是免除了重復勞動的麻煩。 反正最終編譯器都是把被包含文件的內容合並到一塊才編譯的。所以這樣,LZ覺得運行時的調用跟調用任何一個函數有區別嗎。

熱點內容
為什麼小孩兒不願意讓人踩東西 發布:2025-01-10 21:57:50 瀏覽:451
男人瘦為什麼帥 發布:2025-01-10 21:49:53 瀏覽:295
長按文件夾為什麼不能切換 發布:2025-01-10 21:40:41 瀏覽:945
同樣的肌肉量為什麼力量不一樣 發布:2025-01-10 21:40:08 瀏覽:311
為什麼眼睛裡面有細線 發布:2025-01-10 21:38:52 瀏覽:635
為什麼軟體中間要隔兩卦 發布:2025-01-10 21:38:49 瀏覽:200
為什麼眼睛看見藍光看不清東西 發布:2025-01-10 21:37:04 瀏覽:139
金陵十二釵為什麼煙盒文字不一樣 發布:2025-01-10 21:11:11 瀏覽:859
為什麼借唄用一段時間用不了 發布:2025-01-10 21:10:25 瀏覽:650
長時間玩手機為什麼無心寫作業 發布:2025-01-10 21:08:02 瀏覽:395