输出目录文件被多个中间文件输出目录相同的工程包含

时光紧张,先记一笔,后续优化与完善。

    

    case:

    

    两个工程Proj1和Proj2,同时包括demo.cpp,其中Proj1在工程配置里预定义宏MACRO_PROJ1,Proj2在工程配置里预定义宏MACRO_PROJ2,两个工程的旁边文件输出目录为同一个,文件demo.cpp内容如下:

#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、乘电梯的时候总担心死机,并且在墙上找reset键;
  3、指甲特别长,因为按F7到F12比较省力;
  4、只要手里有东西,就不停地按,以为是Alt-F、S;
  5、机箱从来不上盖子,以便判断硬盘是否在转;
  6、经常莫名其妙地跟踪别人,手里不停按F10;
  7、所有的接口都插上了硬盘,因此觉得26个字母不够;
  8、一有空就念叨“下辈子不做程序员了”;
  9、总是觉得9号以后是a号;
  10、不怕病毒,但是很害怕自己的程序;

--------------------------------- 原创文章 By
输出和目录
---------------------------------

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3150442.html