当前位置:编程学习 > 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则比较随机。

易做图ysis:
  在出问题的情况下,既然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!

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,