c++-文件分離

實現文件分離

1.頭文件中不要使用using namespace,因爲c++編譯的特性,因爲初學還沒深刻了解,不作具體編譯的解釋
2.因爲沒有了命名空間,因此string定義要寫成std::string
3.main.cpp中引入staff.cpp,staff.cpp中引入staff.hios

main.cppc++

#include <iostream>
#include <string>
#include <fstream>

#include "staff.cpp"

staff.cpp編程

#include <iostream>
#include <string>
#include <fstream>
#include "staff.h"

using namespace std;

這樣就能夠經過編譯了函數

那麼爲何呢?通過網上查閱資料找到了緣由:spa

可是下面的解釋我感受仍是有不對,下面的內容僅供參考,帶我對c++有了更深的瞭解以後,再寫一篇完整的博客來解釋文件分離的實現,迫於課程設計的安排,不得不囫圇吞棗一下,嘻嘻嘻
還有一點就是在解決這,個問題的時候,又看到有說函數模板解決的,我如今大體明白了函數模板是幹什麼的,但在實現文件分離這一塊還不是很明白,之後再補上,嘿嘿嘿!!~··
接下來介紹一篇我發現的一篇博客,底部有轉載處:.net

  1. namespace和class

命名空間和類,很是類似,好比:設計

std::cout 和A::f(), 都用到了做用域符,均可以防止重名函數,能夠更好的支持多人編程。code

可是有幾個不一樣:blog

  1. namespace 能夠寫在多個不一樣的文件中,而class只能在一個文件中。作用域

  2. 若是想使用A類中的函數如A::f(), 須要創建一個類的實例(靜態函數等除外),而namespace則至關於自己就是一個創建好的實例,能夠直接調用函數。

除此以外,能夠將命名空間看作特殊的類。

須要注意的是千萬不要在h文件中使用using namespace,不然整個文件都會帶上。

  1. .h文件和.cpp文件

首先要知道的是兩種文件的最大區別:

編譯器將全部.cpp文件編譯爲.obj文件再串聯起來。若是.cpp中有#include X.h文件,那麼第一步預處理會把X.h代碼粘貼到.cpp中代替#include語句。

基於這個特性,顯然,若是咱們include 同一工程下的.cpp文件,那麼會將該.cpp文件重複兩次(一次是自己的編譯,一次是include的複製)。所以,.cpp文件不適合進行include。

而咱們每每須要在一個.cpp文件中include不少其餘文件的代碼,那麼這時候就須要.h文件。

一個比喻就是.h是目錄,.cpp是內容。

這裏須要再說一下編譯的過程,關鍵是聲明和定義的區分。

若是是聲明的話,好比聲明瞭一個函數,在彙編語言中就會經過call語句等在全局中尋找這個函數,只須要這個函數在別的.cpp文件中有定義就能夠了,而不須要當時就定義。

對變量也是這樣,當想使用一個別處定義的變量時,首先要聲明,使得該名字爲程序所知。

若是不加「extern」的聲明,如

int j;

則會自動將j定義爲j=0,自動初始化。那麼這時就會出現重複定義等錯誤問題。

所以,應該使用

extern int j;

這將告知程序 有這樣一個j存在,就可使用了。而j的定義在其餘.cpp中,總體編譯完後就能夠得到j的定義了。

函數則會自動默認爲是extern的效果。

所以,在.h中進行聲明,在.cpp中進行定義。能夠避免重複的編譯,也更便於管理。

注意,不能在函數體內初始化一個extern變量,由於函數體的做用域僅在函數內。

感謝這篇博客給的我啓發

相關文章
相關標籤/搜索