我正在将旧版C ++系统从VC6移植到VC9。
应用程序(<APP A>)
静态链接到内部应用程序<APP B>
(由内部开发但由单独的团队开发)。
来自<APP B>
的头文件的本地副本包含在CPP文件中,并在<APP A>.
目前我们不打算将<APP B>
迁移到VC9。虽然<APP A>
和<APP B>
都会使用单独的CRT,但不会发生冲突。
我们面临的问题是来自(本地副本)的包含文件没有使用VC9编译。
致命错误C1083:无法打开包含 file:'iostream.h':没有这样的文件或 目录
可能的解决方案:
如果我在<APP A>
的本地副本中进行更改并使用VC9进行编译,那么我不确定它是否会在运行时导致某些问题。
有没有其他方法可以让VC9用<APP A>
代替<iostream.h>
编译<iostream>
个文件?
答案 0 :(得分:4)
很抱歉,但是你遇到了很多问题。
首先是基础:<iostream.h>
是较旧的Microsoft标头,用于定义例如::cout
。 <iostream>
是标准标头,并定义了例如std::cout
。你可以使用这两个,但这个标题
应该不包含在APP.H
中。 <iostream>
未定义您在声明中使用的类型。据推测,您依赖于VC6实现的工件,即<iostream.h>
和<istream.h>
中的<ostream.h>
。您可能希望切换到<iosfwd>
,而 旨在用于标题。
然而,更大的问题是您可以将“APP A”和“APP B”链接在一起,即使它们是使用VC6和VC9编译的。这是真的当且仅当他们共享一个extern "C"
API。C ++名称修改(故意)它们之间有所不同。既然你提到<iostream.h>
而不是<stdio.h>
,我会假设你的共同点真的是C ++。
答案 1 :(得分:1)
Michael Feathers http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052有一本关于这类项目的好书。
简短的回答是,如果您有测试,进行必要的更改和重构并重新运行测试。对于您的示例,我将使用预处理程序指令根据编译器版本选择正确的包含,然后修复任何损坏的测试。
如果没有测试你会遇到更多麻烦,你可以写下它们或祈祷你不要破坏任何东西
答案 2 :(得分:1)
我怀疑这个编译器错误是唯一的问题。更新编译器几乎总是会引入一些问题。最好解决这些冲突并认真检验结果。我不认为一些“解决方法”会减少麻烦,因为无论如何编译器都是不同的。
在并行使用不同编译器时解决此类问题的唯一解决方案是条件编译,例如:
#if _MSC_VER >= 1200
// Code for VC 6.0 or higher goes here
#endif
请注意,_MSC_VER
的数字与Visual Studio的版本不同。
对于Visual Studio 2010,即_MSC_VER
定义为1600。