程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 文件被多個中間文件輸出目錄相同的工程包含

文件被多個中間文件輸出目錄相同的工程包含

編輯:C++入門知識

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!

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved