1

我正在将旧版 C++ 系统从 VC6 移植到 VC9。

应用程序(<APP A>)静态链接到内部应用程序<APP B>(内部开发,但由单独的团队开发)。头文件的本地副本<APP B>包含在 CPP 文件中并编译为<APP A>.

目前我们不打算迁移<APP B>到 VC9。虽然两者都<APP A><APP B>使用单独的 CRT,但预计不会发生冲突。

我们面临的问题是来自(本地副本)的包含文件没有用 VC9 编译。

致命错误 C1083:无法打开包含文件:'iostream.h':没有这样的文件或目录

可能的解决方案:如果我在本地副本中进行更改<APP A>并使用 VC9 进行编译,那么我不确定它是否会在运行时引起一些问题。

有没有其他方法可以让 VC9 编译<APP A>文件<iostream.h>而不是<iostream>

4

3 回答 3

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++。

于 2010-08-30T09:42:00.537 回答
1

Michael Feathers 有一本很棒的书http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052,关于这类项目。

简短的回答是,如果您有测试,请进行所需的更改和重构并重新运行您的测试。对于您的示例,我将使用预处理器指令根据编译器版本选择正确的包含,然后修复任何损坏的测试。

如果没有测试,你会遇到更多麻烦,你要么写它们,要么祈祷你不要破坏任何东西

于 2010-08-30T08:32:44.450 回答
1

我怀疑这个编译器错误将是唯一​​的问题。更新编译器几乎总是会引入少量问题。最好解决这些冲突并认真测试结果。我不认为某些“解决方法”会减少麻烦,因为编译器无论如何都是不同的。

并行使用不同编译器时解决此类问题的唯一解决方案是条件编译,例如:

#if _MSC_VER >= 1200 
   // Code for VC 6.0 or higher goes here
#endif

请注意,该数字_MSC_VER与 Visual Studio 版本的数字不同。对于 Visual Studio 2010,ie_MSC_VER定义为 1600。

于 2010-08-30T09:15:56.883 回答