zoukankan      html  css  js  c++  java
  • 输出目录文件被多个中间文件输出目录相同的工程包含

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

        

        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
    输出和目录
    ---------------------------------

  • 相关阅读:
    响应报文
    IntelliJ IDEA 使用Git怎样记住密码和忘记密码的方法
    vue基础——命名路由
    vue基础——路由懒加载
    vue hash模式下如何使用a标签的锚点定位
    vue项目中修改第三方库的组件样式的方法
    CSS3实现水波纹效果
    日期对象Date的计算
    兼容性查询工具
    根据.svg文件借助IconMoon生成字体图标及应用的方法
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3150442.html
Copyright © 2011-2022 走看看