做了一個實驗。
最后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__,因此都執行了定義工作。
另外一個收獲:在函數外部只能對變量和函數進行聲明和定義工作,無法進行變量修改以及調用函數等操作。