代碼編譯

1.編譯兩個源代碼文件


在UNIX系統中編譯由多個文件組成的C++程序

2.頭文件管理

在同一個文件中只能將同一個頭文件包含一次。我們有可能在不知情的情況下將頭文件包含多次。有一種標準的C/C++技術可以避免多次包含同一個頭文件。它是基於預處理編譯器指令#ifndef的。例如:

coordin.h

#ifndef _COORDIN_H_
#define _<span style="font-family: Arial, Helvetica, sans-serif;">COORDIN</span><span style="font-family: Arial, Helvetica, sans-serif;">_H_</span>


#endif
編譯器第一次遇到coordin.h時,_COORDIN_H_沒有定義。在這種情況下,編譯器將查看#ifndef與#endif之間的內容。當在同一個文件中再次遇到包含coordin.h的代碼,編譯器知道_COORDIN_H_已經被定義過,從而跳到#endif後面的一行上。注意,這種方法並不能防止編譯器將文件包含兩次,而是讓它忽略除第一次包含之外的所有內容。大多數標準C/C++頭文件都使用這種防護方案。否則,可能在一個文件中定義同一個結構兩次,這將導致編譯錯誤。

3.多個庫的鏈接

C++標準允許每個編譯器設計人員以他認爲合適的方式實現名稱修飾,因此由不同編譯器創建的二進制模塊很可能無法正確地鏈接。也就是說,兩個編譯器將爲同一個函數生成不同的修飾名稱。名稱的不同將使鏈接器無法將一個編譯器生成的函數調用與另一個編譯器生成的函數定義匹配。在鏈接編譯模塊時,請確保所有對象文件或庫都是由同一個編譯器生成的。


名稱修飾:C++如何跟蹤每一個重載函數呢?它給這些函數指定了祕密身份。使用C++開發工具中的編輯器編寫和編譯程序時,C++編譯器將執行一些神奇的操作——名稱修飾(name decoration)或名稱矯正(name mangling),它根據函數原型中指定的形參類型對每個函數名進行加密。以下是未經修飾的函數原型:

long MyFunctionFoo(int, float);
這種格式很適合閱讀,我們知道函數接受兩個參數,並返回一個long值。而編譯器將名稱轉換爲另一種內部表述,來描述該接口,如下所示:

?MyFunctionFoo@@YAXH
對原始名稱進行的表面看來無意義的修飾將對參數數目和類型進行編碼。添加的一組符號隨函數特徵標而異,而修飾時使用的約定隨編譯器而異。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章