4

我在尝试将我的 C++ 源代码从 HP-UX 移植到 Linux 时遇到了这个问题。当我尝试在 Linux 上编译 C++ 源代码时,它会抱怨组件(来自标准 C++ 库)不存在。使用命名空间std放置行;在源代码的顶部似乎解决了这个问题。当我尝试在 HP-UX 上重新编译代码时,aCC 编译器抱怨这里只有命名空间名称是有效的(它不认为 std 是一个有效的命名空间)。我想知道是否有办法解决这个问题,以便源代码与 HP-UX 长期弃用的 C++ 编译器和 LINUX 的 GCC 编译器二进制兼容。

4

5 回答 5

6

这很糟糕,但你可以这样做:

#ifndef __HP_aCC
using namespace std;
#endif

这里定义,我无法验证。

于 2012-06-11T19:48:36.787 回答
2

您可以使用预处理器来检查操作系统以及是否包含namespace std; 因此,如果您的操作系统不是 HP aCC,则它不包含 std,否则它包含。像这样:

#ifndef __HP_aCC
using namespace std;
#endif

或者,如果您想检查 linux 和 win,并且仅在那些操作系统的情况下使用命名空间 std;你也可以这样做:

#if defined(WIN32) || defined(LINUX)
using namespace std;
#endif

希望有帮助!

于 2012-06-11T19:55:10.230 回答
1

#ifdef如果你真的不想要's ,你应该能够做到这一点:

namespace std {}
using namespace std;

也就是说,创建或扩展std命名空间。在 Linux 上,它将扩展,而在 HP-UX 上,它将创建。在任何一种情况下,using都将是有效的。

但是,如果 HP-UX 编译器和您说的一样旧,那么包含 C++ 头文件的源代码很可能是旧样式:

#include <iostream.h>

而不是现代风格:

#include <iostream>

如果您有解决此问题的方法,那么您可能在代码中的某个地方使用了条件编译。如果您已经将这些特定于平台的决策本地化到代码中的一个位置,那么这将是添加代码以仅using namespace std用于那些需要它的平台的地方。

于 2012-06-11T19:49:30.903 回答
1
  1. 确保您包含正确的标题。C++ 没有定义哪些标准头文件可能包含其他标准头文件,因此当您使用间接包含时,实现的行为会有所不同。因此,只需验证您需要包含的所有内容是否都直接包含在内。

  2. 不要using namespace std;只使用完全限定您使用的名称,或使用using调用您需要的特定组件的声明。

      using std::string;
    
      string s; // no need for using namespace std
    
于 2012-06-11T20:07:59.007 回答
0

您可以使用特定于平台的常量,例如LINUXorWIN32来添加或不添加行using namespace std。执行此操作的常用方法是制作(或者更常见的是生成)一个config.h文件,为您使用的特定于平台的类型名称定义别名。

于 2012-06-11T19:47:00.613 回答