原文:https://blog.csdn.net/xueruifan/article/details/50569639
現有兩個文件Test.h 和Test.cpp #include <iostream>在Test.h中包含 和在Test.cpp中包含有什么區別?
1、在cpp文件中包含.h文件,要么你要用到這個頭文件中的函數或者類,要么就是實現這個頭文件;
2、.h ---就是為了放一堆聲明所產生的東西。 如果是定義放在.h中。 如果.h被重復包含多次,那么則會被報重定義。所以在.h 中都要---如果函數就要是inline ,如果是變量就要 selectany (windows)才不會被報錯。
3、#include盡量寫到cpp文件里。兩個文件在.h文件里相互include,就會產生編譯錯誤,而兩個文件在.c文件互相include,就不會有該問題,因此在.h文件include就要避免互相包含的問題,而.cpp文件就不需要考慮
4、1)在 .h 里面 include 的好處是:
如果很多.c,.cpp文件,都包含一批頭文件,
如果復制很容易遺漏
如果輸入,很容易出錯
如果全部在一個.h, include 那么每個.c,.cpp文件只需要一個#include 語句
這樣不僅輸入量減少,
而且代碼也美觀多了
代碼也主次分明了
畢竟,.c.cpp, 里面
要實現的函數,才是主要代碼
2)主要缺陷,
可能會包含完全不需要的頭文件,
增加編譯工作量
5、如果你在a.h頭文件中include了“stdio.h”,“iostream”,……一大堆
那么你的a.cpp源文件只要include你的a.h,就相當於include了“stdio.h”,“iostream”,……一大堆
但是當其他文件include你的a.h的同時也就包含了“stdio.h”,“iostream”,……一大堆
這個要看你個人需要,如果你需要讓其他文件也include一大堆,那么寫在a.h中就可以,其他文件包含a.cpp簡單整潔無腦
如果只有a.cpp需要include一大堆,那么還是建議在a.cpp中include一大堆
6、如果a.c包含了頭文件a.h,a.h包含了頭文件b.h,b.c也包含了b.h,那么當b.h發生改變時,a.c和b.c都會重新編譯
也就是所有包含了b.h的都會重新編譯,無論是直接包含,還是間接包含
7、2點原則:
第一個原則:如果可以不包含頭文件,那就不要包含了,這時候前置聲明可以解決問題。如果使用的僅僅是一個類的指針,沒有使用這個類的具體對象(非指針),也沒有訪問到類的具體成員,那么前置聲明就可以了。因為指針這一數據類型的大小是特定的,編譯器可以獲知(C++編譯器自上而下編譯源文件的時候,對每一個數據的定義,總是需要知道定義的數據的類型的大小) 第二個原則:盡量在CPP文件中包含頭文件,而非在頭文件中。假設類A的一個成員是是一個指向類B的指針,在類A的頭文件中使用了類 B的前置聲明並編譯成功,那么在A的實現中我們需要訪問B的具體成員,因此需要包含頭文件,那么我們應該在類A的實現部分(CPP文件)包含類B的頭文件而非聲明部分(H文件)