时光紧张,先记一笔,后续优化与完善。
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
输出和目录
---------------------------------