實現文件分離 1.頭文件中不要使用using namespace,由於c++編譯的特性,由於初學還沒深入瞭解,不做具體編譯的解釋 2.由於沒有了命名空間,所以string定義要寫成std::string 3.main.cpp中引入staff.cpp,staff.cpp中引入staff.h main. ...
實現文件分離
1.頭文件中不要使用using namespace,由於c++編譯的特性,由於初學還沒深入瞭解,不做具體編譯的解釋
2.由於沒有了命名空間,所以string定義要寫成std::string
3.main.cpp中引入staff.cpp,staff.cpp中引入staff.h
main.cpp
#include <iostream>
#include <string>
#include <fstream>
#include "staff.cpp"
staff.cpp
#include <iostream>
#include <string>
#include <fstream>
#include "staff.h"
using namespace std;
這樣就可以通過編譯了
那麼為什麼呢?經過網上查閱資料找到了原因:
但是下麵的解釋我感覺還是有不對,下麵的內容僅供參考,帶我對c++有了更深的瞭解之後,再寫一篇完整的博客來解釋文件分離的實現,迫於課程設計的安排,不得不囫圇吞棗一下,嘻嘻嘻
還有一點就是在解決這,個問題的時候,又看到有說函數模板解決的,我現在大致明白了函數模板是乾什麼的,但在實現文件分離這一塊還不是很明白,以後再補上,嘿嘿嘿!!~··
接下來介紹一篇我發現的一篇博客,底部有轉載處:
- namespace和class
命名空間和類,非常相似,比如:
std::cout 和A::f(), 都用到了作用域符,都可以防止重名函數,可以更好的支持多人編程。
但是有幾個不同:
namespace 可以寫在多個不同的文件中,而class只能在一個文件中。
如果想使用A類中的函數如A::f(), 需要建立一個類的實例(靜態函數等除外),而namespace則相當於本身就是一個建立好的實例,可以直接調用函數。
除此之外,可以將命名空間看做特殊的類。
需要註意的是千萬不要在h文件中使用using namespace,否則整個文件都會帶上。
- .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變數,因為函數體的作用域僅在函數內。