如何避免不能使用命名空间std; 在C ++中

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

Solutions Collecting From Web of "如何避免不能使用命名空间std; 在C ++中"

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

#ifndef __HP_aCC using namespace std; #endif 

从这里定义,我无法验证。

你可以使用预处理器来检查操作系统是否包含namespace std ; 所以如果你的操作系统不是HP aCC,那么它不包括std,否则就是。 像这样:

 #ifndef __HP_aCC using namespace std; #endif 

或者如果你想检查Linux和WIN,并只使用命名空间标准,如果它的操作系统; 你也可以这样做:

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

希望有所帮助!

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

 namespace std {} using namespace std; 

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

但是,如果HP-UX编译器与您所说的一样古老,那么包含C ++头文件的源代码可能就是旧的风格:

 #include <iostream.h> 

而不是现代风格:

 #include <iostream> 

如果你有解决这个问题的方法,那么你可能在你的代码中使用了条件编译。 如果您已经在代码中将这些特定于平台的决策集中在一个地方,那么这就是添加代码的地方,只需要为需要它的平台using namespace std

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

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

      using std::string; string s; // no need for using namespace std 

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