[英]Compilation issues for Migration from VC6 to VC9
我正在将旧版C ++系统从VC6移植到VC9。
应用程序( <APP A>)
静态链接到内部应用程序<APP B>
(内部开发,但由单独的团队开发)。 来自<APP B>
的头文件的本地副本包含在CPP文件中,并在<APP A>.
编译<APP A>.
当前,我们不打算将<APP B>
迁移到VC9。 尽管<APP A>
和<APP B>
都将使用单独的CRT,但是不会出现冲突。
我们面临的问题是VC9无法编译来自(本地副本为)中的包含文件。
严重错误C1083:无法打开包含文件:iostream.h:没有此类文件或目录
可能的解决方案:如果我在<APP A>
本地副本中进行更改并使用VC9进行编译,则不确定在运行时是否会引起某些问题。
还有其他方法可以要求VC9使用<iostream.h>
而不是<iostream>
编译<APP A>
文件吗?
抱歉,您遇到了很多问题。
首先是基础知识: <iostream.h>
是一个较旧的Microsoft标头,用于定义例如::cout
。 <iostream>
是Standard标头,并定义例如std::cout
。 您可以使用这两个的,但是这头不应该包括在APP.H
。 <iostream>
不会定义要在声明中使用的类型。 大概您依赖VC6实现的工件,即<iostream.h>
<istream.h>
了<istream.h>
和<ostream.h>
。 你可能想切换到<iosfwd>
相反,其目的是在标题中使用。
但是,更大的问题是您假设即使将“ APP A”和“ APP B”都用VC6和VC9编译,也可以将它们链接在一起。 只有当它们共享一个extern "C"
API时,这才是正确的。两者之间的修改是有意不同的,并且由于您提到的是<iostream.h>
而不是<stdio.h>
,所以我将假定您的共同点是真正的C ++。
迈克尔·费瑟斯(Michael Feathers)有一本很棒的书,是关于这类项目的。http: //www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052。
简短的答案是,如果您有测试,请进行必要的更改和重构,然后重新运行测试。 对于您的示例,我将使用预处理程序指令根据编译器版本选择正确的包含,然后修复所有损坏的测试。
没有测试,您会遇到更多麻烦,要么编写它们,要么祈祷您什么都不会破坏
我怀疑此编译器错误将是唯一的问题。 更新编译器几乎总是会带来少量问题。 最好解决这些冲突并认真测试结果。 我不认为某些“解决方法”将减少麻烦,因为无论如何编译器都是不同的。
当并行使用不同的编译器时,解决此类问题的唯一解决方案是条件编译,例如:
#if _MSC_VER >= 1200
// Code for VC 6.0 or higher goes here
#endif
请注意, _MSC_VER
与Visual Studio版本号不同。 对于Visual Studio 2010,即_MSC_VER
定义为1600。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.