case:
兩個工程Proj1和Proj2,同時包含demo.cpp,其中Proj1在工程配置裡預定義宏MACRO_PROJ1,Proj2在工程配置裡預定義宏MACRO_PROJ2,兩個工程的中間文件輸出目錄為同一個,文件demo.cpp內容如下:
[cpp]
#include <stdio.h>
int main()
{
#ifdef MACRO_PROJ1
printf("output by proj1");
#elif defined MACRO_PROJ2
printf("output by proj2");
#endif
return 0;
}
#include <stdio.h>
int main()
{
#ifdef MACRO_PROJ1
printf("output by proj1");
#elif defined MACRO_PROJ2
printf("output by proj2");
#endif
return 0;
} 然後編譯兩工程生成Proj1.exe和Proj2.exe,期望的結果是Proj1.exe輸出output by proj1,Proj2輸出output by proj2,但是……意外發生了:
會發現一定的概率下,兩個exe輸出的內容相同,至於是output by proj1還是output by proj2則比較隨機。
analysis:
在出問題的情況下,既然Proj1.exe和Proj2.exe輸出一致,那麼可以推測生成兩個exe的源中間文件demo.obj是一樣的,明明在兩個工程裡根據宏定義,預編譯過後的源代碼是不一樣的,怎麼會出現生成的obj文件一樣的情況呢?聯想到編譯器的“懶惰”特性,推測出發生問題的情況如下:
假設首先編譯Proj1,那麼預編譯過後,源文件裡生效的應該是printf("output by proj1");這一行,生成demo.obj,然後鏈接生成Proj1.exe;然後在編譯Proj2時,編譯器會先對比demo.cpp和demo.obj的時間戳,發現demo.obj的修改時間比較新,那麼就不用重新編譯,就將之前生成的demo.obj直接用於鏈接生成了Proj2.exe。
confirmation:
更改Proj1與Proj2兩個工程的中間文件輸出目錄為兩個不同的目錄,問題不再發生。
Done!