LV. 8
GP 30

RE:【問題】c++ include問題

樓主 B bachelorwhc
GP3 BP-
※ 引述《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檔就能使用我的函式庫」

3
-
未登入的勇者,要加入討論嗎?
板務人員:歡迎申請板主

精華區有 10 筆文章
目前無人維護,申請組長


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】