※ 引述《akevin0421 (Kitto)》之銘言> 請問c++中 include在.h檔或.cpp檔 > 之前學的時候是把所有要include的東西放在.h檔集中管理 > .cpp 就很乾淨的include 1個自己的.h檔就好 > 最近開始寫自己的專案 現在越寫越多檔案的時候經常在.h檔 include檔案就一堆錯誤 > 可是在.cpp檔include就沒有錯誤了。所以想問一下我之前的理解是錯的嗎 > 應該是 > 例如在Aclass.h有 > Bclass something (){return Bclass} > 這種需要用到b的時候才在Aclass.h include > 不然只有在.cpp檔用到Bclass的話 就在.cpp檔include就好? > 另外include 在.h 跟.cpp有什麼分別?不知道為什麼有時候include在cpp就沒有錯誤 能成功運行了 > 自學+自己表達能力不太好 希望有傳達到我的問題
header檔案需要include guard,例如pragma once、ifndef
header include header是沒有問題 但有時會有額外的成本
header的撰寫除了template或static inline以外 比較傾向單純的宣告
而cpp(source)則是定義
什麼叫宣告
class A;
這叫我宣告一個名為A的class,宣告並不光是只能宣告變數而已,宣告型別也是有的
對下面兩個function signature來說 他們需要的資訊完全不同
void Foo(A);
void Boo(A*);
對Foo來說他需要的是一個型別為A的引數(Argument),當一個function接收引數時實際上是把引數的數據上stack,此時該引數的參數到底有多大(換言之,A到底是什麼)就是編譯器必須知道的。對Boo來說,他需要的是一個型別為A*的引數,指針大小則是視編譯目標的架構而定,所以他不需要知道A到底有多大。
所以業界要求開發者寫C++的時候 會很注重header還有include的內容安排
時間 = 金錢, 如果你header跟include不管三七二十一什麼都加,編譯時間會爆增(precompiled又是另一個議題)
承接上面的例子
~header_a.h
#include "A.h"
void Foo(A);
~header_b.h
class A;
void Boo(A*);
在header_a我include了A.h,當A.h有變更時,有include header_a的程式碼需要一同重新編譯;在header_b的案例中,他只使用了forward declaration,只有需要知道A定義的原始碼需要重新編譯而已。
對一些專門開發函式庫的公司來說,這也有效解決保密和設計問題。你確實是可以把class的定義通通寫在header裡,但當你不想這麼做時,釐清header與source的意義就很重要。你可以發現有些open source project會有一個目錄叫public,裡面放滿一堆header檔。這默默地暗示拿到這個project的人:「如果你不在乎我的黑箱子裡做了什麼,你只要include public的header檔就能使用我的函式庫」