1、程序的處理的步驟
步驟 |
所進行的內容 |
生成的文件 |
預處理 |
展開頭文件/宏替換/去掉註釋/條件編譯 |
“.i”文件 |
編譯 |
檢查語法,生成彙編 |
“.s”文件 |
彙編 |
彙編代碼轉換機器碼 |
“.o”目標文件 |
鏈接 |
鏈接到一起生成可執行程序 |
“.out”或“.exe”可執行文件 |
- define:預處理期間處理,實際上所有的帶#的都是在預處理期間處理的。
- typedef:編譯期間處理。
- template:模板的實例化類型確定是在編譯期間,模板實例化只會實例化用到的部分,沒有用到的部分將不會被實例化。
例1:
#include <iostream>
#include <set>
using namespace std;
template<class T>
class A
{
public:
A() {}
~A() {}
void add(T &t) {
key.insert(t);
}
void display() {
for(auto &var : key) {
cout << var << " ";
}
cout << endl;
}
protected:
typedef set<T> mySet;
private:
mySet key;
};
int main()
{
//A<int> a;
//for (int i = 0; i < 5; i++) {
// a.add(i);
//}
//a.display();
system("pause");
return 0;
}
輸出:
可以看出以上程序編譯通過併成功運行,因爲typedef定義類型轉變的時候必須是已經定義的類型,而template<class T>可以看作是對T做了定義,故可直接使用。
例2:
修改例1代碼:
#include <iostream>
#include <set>
using namespace std;
typedef set<T> mySet; // 錯誤
template<class T>
class A
{
public:
A() {}
~A() {}
void add(T &t) {
key.insert(t);
}
void display() {
for(auto &var : key) {
cout << var << " ";
}
cout << endl;
}
private:
mySet key;
};
int main()
{
A<int> a;
for (int i = 0; i < 5; i++) {
a.add(i);
}
a.display();
system("pause");
return 0;
}
以上代碼編譯出錯,出錯原因爲“未定義標識符T”。因爲typedef在類外,首先運行該typedef語句,而T是未定義類型,故而出錯。因此在C++中判斷typedef和模板能否同時使用關鍵是要判斷兩者的前後定義順序。