1)預處理器: 將#include"" #define 等預編譯命令后的語句在文件中展開,為了防止循環include某個文件,一般采用#pragma once 或者#ifndef #define #endif等方法。預處理過的代 碼一般放在一個中間文件中。此時你的工程中有N個
中間文件。2)編譯器: 每個中間文件都以一個編譯單元,并且可以單獨編譯,但是每個編譯單元中的變量編譯器一定要知道。要實現這個功能就要靠變量(或者函數)的聲明。聲明是告訴編譯器,我有 這樣一個類型的變量,或者這個類型的函數,等會要用到,你等會檢查的時候,看看我傳入的參數和返回值是不是符合原型,符合的話你就不要報錯了。如果編譯期間進行了語法檢查之 后沒有錯誤的話,編譯器會將這種中間文件生成
目標模塊.obj格式文件。這種文件中一般是匯編語言。
3)連接器: 把一組目標模塊連接成一個可執行程序。這個時候就需要變量或者函數的定義了。如果A目標模塊中有個函數void f(int a){};B模塊中需要調用f(1)的話,連接器會去搜索 庫,如果A模塊在這個庫中的話,那么A模塊就會被連接進這個B模塊,但是整個庫不會被連接進來,不然,exe文件就太大了。
4)聲明與定義 聲明不分配空間。
定義分配空間。
有時聲明一個變量與定義一個變量混在一起。如果想分開,就用extern,明確表明這是一個聲明,該變量的定義在該文件后面或者在另一個文件里面。函數聲明一般是默認
e xtern的。
5)連接階段的外連和內連 控制一個變量或者一個函數的可見性。extern 外連。static 內連。 const?忘了。
6)頭文件 一般放變量或者函數的聲明,可以被包含。C++中有多次包含,一次定義的規定,所以,變量的定義一般不放在頭文件中,防止多次定義。
7)連接器如何查找庫 當C++要對函數或者變量進行外部引用的時候,根據引用情況,有兩種處理方法。一、如果還沒有遇到過這個變量或者函數的定義,連接器把它的標志符加到“未解析的引用”列表 中;二、如果連接器遇到過定義,那就加到“解析的引用“列表中。
如果在當前目標模塊找不到定義,它將會去查找庫。在庫中找到定義后,就將整個模塊而不僅僅是函數定義連接到可執行程序。(其實我要的只是這么一個函數,一個模塊太多 了)。
因為連接器按照指定的順序查找文件(先查本模塊,再查庫文件),所以,如果你預先定義了一個庫中的同名函數的話,那么就不會調用庫中的方法了。
這就是為什么如果你重載了 new和delete之后,標準的new delete就不再有用的原因了。所以大家要重載這兩個操作符的時候一般不要弄成全局函數,一般要弄成成員函數哈。8)名字空間 防止名字沖突,加一層保護。
posted on 2012-05-28 15:00
Dino-Tech 閱讀(373)
評論(0) 編輯 收藏 引用