vs源文件编译顺序–根据源文件在项目中先后建立的顺序决定,不是排序位置决定

  • Post author:
  • Post category:其他


第三天终于解决问题了,第二天和第三天到现在之前有种想摔鼠标的冲动,有种绝望的感觉。

好吧,描述下问题。

问题:两个看起来完全相同的工程,完全相同的源文件、头文件,总之所有的东西看起来都是完全一模一样。

精简后的项目test1.0如下:A.h B.h A.cpp B.cpp M.cpp。

各文件内容如下:

执行test1.0,得到的结果如下:

编译顺序为 A.cpp B.cpp Main.cpp,编译的依赖关系正确,得到的结果为6是对的。

然后问题来了>>>>>>>>>>>>>>>>>>>

1》新建项目test2.0 :添加和test1.0相同名称的头文件和源文件。

2》将test1.0中所有文件的内容复制到test2.0中对应的文件中

3》这一步是关键:在复制源文件的时候,将源文件A.cpp复制到B.cpp中,将B.cpp复制到A.cpp文件中,然后再将文件名改对(交叉复制的,为了让源文件定义和名字对应,所以需要改一下),(如果将A.cpp 和B.cpp移到头文件目录下,再移回来,这时候会自动排序为A.cpp在前,B.cpp在后)这时候test2.0和test1.0看起来是完全一模一样的,唯一不同的地方就是test2.0中的A.cpp实际上是在B.cpp后创建的。

4》执行test2.0,结果如下:(

注:A.cpp中的y变量要求必须用x变量初始化,如果用常量初始化运行得到的结果不会有不同。在用x变量初始化时出现这种问题,应该是一个Bug吧


编译顺序为 B.cpp A.cpp Main.cpp,编译的依赖关系正确,得到的结果为0,和期望的完全不同,当然这里不同是因为依赖关系混乱造成未用我们定义的变量赋值初始化造成的。


我们回过头去看看文件的依赖关系,应该是 Main.cpp依赖B.cpp,而B.cpp依赖A.cpp,所以正确的编译顺序应该是test1.0的编译顺序,而test2.0的编译顺序明显乱了(y变量不用x赋值是仍然能得到正确结果),在给B.cpp中z变量赋值时初始化为0,而唯一的不同我们也分析过了,这一点在g++编译器上也验证过了。

结论:

所以得到一个结论就是在VS编译环境下编译的依赖关系和编译的先后顺序是根据创建源文件的先后顺序决定的,而不是根据文件依赖关系推导出来的,所以在用Vs编写项目的时最好让文件的创建顺序和文件的依赖关系对应起来,不然可能会出现间接赋值为0的问题。



版权声明:本文为LLJ_DS原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。