2012-06-11 94 views
4

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

回答

6

这很烂,但你可以这样做:

#ifndef __HP_aCC 
using namespace std; 
#endif 

here定义,我也没有办法核实。

+0

谢谢。该程序现在与aCC和GCC二进制兼容! :) – Justin

0

您可以使用特定于平台的常量,如LINUXWIN32来添加或不添加行using namespace std。通常的做法是制作(或更经常地生成)config.h文件,为您使用的平台特定的类型名称定义别名。

1

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

namespace std {} 
using namespace std; 

也就是说,创建或扩展的std命名空间。在Linux上,它将进行扩展,并在HP-UX上创建。无论哪种情况,using都是有效的。

但是,如果HP-UX编译器是一样老,你说的,然后包括C++头文件的源代码很可能是老式:

#include <iostream.h> 

,而不是现代风格:

#include <iostream> 

如果您有解决此问题的解决方案,那么您可能在代码中的某处使用了条件编译。如果您已经将这些特定于平台的决定集中在您的代码中的单个位置,那么这将是添加代码的地方,仅为需要它的那些平台执行using namespace std

2

您可以使用预处理程序检查操作系统以及是否包含namespace std;所以如果你的操作系统不是HP aCC,它不包括std,否则它会。像这样:

#ifndef __HP_aCC 
using namespace std; 
#endif 

,或者如果你想检查linux和赢,如果这些OS只使用空间std;你也可以这样做:

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

希望有所帮助!

+0

谢谢。这有帮助。 :) – Justin

1
  1. 确保您包含正确的标题。 C++没有定义哪些标准头文件可能包含其他标准头文件,因此在使用间接包含文件时,实现的行为会有所不同。因此,只需确认您需要包含的所有内容都包含在中直接

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

    using std::string; 
    
        string s; // no need for using namespace std 
    
相关问题