一個工程中cpp文件的編譯順序


做了一個實驗。

 

最后build失敗,失敗的原因是變量i被重定義了。原本按照我的思路,是不應該失敗的。因為我用了條件編譯,若先編譯Source.cpp,則會#define __HEADER_H__並且定義變量i,等到之后再編譯main.cpp時,由於已經定義__HEADER_H__,就會跳過變量i的定義。最終i只被定義一次,完美。

 

不管怎么說,編譯器是不會出錯的,仔細尋找一下原因吧。根據上面的實驗結果可以推測出,兩個cpp文件中#ifndef 和 #endif之間語句都得到了執行。

將上面的代碼稍作改動。

 

 編譯沒問題,說明i和j確實都沒定義過了=>兩個cpp中#ifdef和#endif的語句都被執行過了。

 

網上搜索的一下資料,最終得到如下結論:

每個cpp文件都是單獨編譯的,之后再對所有cpp文件編譯后形成的中間文件進行連接。因此在本例中,兩個cpp文件都認為自己沒有定義__HEADER_H__,因此都執行了定義工作。

 

另外一個收獲:在函數外部只能對變量和函數進行聲明和定義工作,無法進行變量修改以及調用函數等操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM