我在尝试将我的 C++ 源代码从 HP-UX 移植到 Linux 时遇到了这个问题。当我尝试在 Linux 上编译 C++ 源代码时,它会抱怨组件(来自标准 C++ 库)不存在。使用命名空间std放置行;在源代码的顶部似乎解决了这个问题。当我尝试在 HP-UX 上重新编译代码时,aCC 编译器抱怨这里只有命名空间名称是有效的(它不认为 std 是一个有效的命名空间)。我想知道是否有办法解决这个问题,以便源代码与 HP-UX 长期弃用的 C++ 编译器和 LINUX 的 GCC 编译器二进制兼容。
5 回答
您可以使用预处理器来检查操作系统以及是否包含namespace std
; 因此,如果您的操作系统不是 HP aCC,则它不包含 std,否则它包含。像这样:
#ifndef __HP_aCC
using namespace std;
#endif
或者,如果您想检查 linux 和 win,并且仅在那些操作系统的情况下使用命名空间 std;你也可以这样做:
#if defined(WIN32) || defined(LINUX)
using namespace std;
#endif
希望有帮助!
#ifdef
如果你真的不想要's ,你应该能够做到这一点:
namespace std {}
using namespace std;
也就是说,创建或扩展std
命名空间。在 Linux 上,它将扩展,而在 HP-UX 上,它将创建。在任何一种情况下,using
都将是有效的。
但是,如果 HP-UX 编译器和您说的一样旧,那么包含 C++ 头文件的源代码很可能是旧样式:
#include <iostream.h>
而不是现代风格:
#include <iostream>
如果您有解决此问题的方法,那么您可能在代码中的某个地方使用了条件编译。如果您已经将这些特定于平台的决策本地化到代码中的一个位置,那么这将是添加代码以仅using namespace std
用于那些需要它的平台的地方。
确保您包含正确的标题。C++ 没有定义哪些标准头文件可能包含其他标准头文件,因此当您使用间接包含时,实现的行为会有所不同。因此,只需验证您需要包含的所有内容是否都直接包含在内。
不要
using namespace std;
只使用完全限定您使用的名称,或使用using
调用您需要的特定组件的声明。using std::string; string s; // no need for using namespace std
您可以使用特定于平台的常量,例如LINUX
orWIN32
来添加或不添加行using namespace std
。执行此操作的常用方法是制作(或者更常见的是生成)一个config.h
文件,为您使用的特定于平台的类型名称定义别名。