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

时间:2012-06-11 19:43:30

标签: c++ linux gcc hp-ux

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

5 个答案:

答案 0 :(得分:6)

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

#ifndef __HP_aCC
using namespace std;
#endif

here定义,我无法验证。

答案 1 :(得分:2)

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

#ifndef __HP_aCC
using namespace std;
#endif

或者如果你想检查linux并获胜,只使用命名空间std,如果它是那些操作系统;你也可以这样做:

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

希望有所帮助!

答案 2 :(得分:1)

如果你真的不想要#ifdef

,你应该能够这样做
namespace std {}
using namespace std;

即创建或扩展std命名空间。在Linux上,它将扩展,并且在HP-UX上,它将创建。在任何一种情况下,using都有效。

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

#include <iostream.h>

而不是现代风格:

#include <iostream>

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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