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

hereから定義されており、確認する方法がありません。

于 2012-06-11T19:48:36.787 に答える
2

プリプロセッサを使用して、OSをチェックし、namespace std;を含めるかどうかを確認できます。したがって、OSがHP aCCでない場合は、stdが含まれていません。それ以外の場合は含まれています。そのようです:

#ifndef __HP_aCC
using namespace std;
#endif

または、Linuxをチェックして勝ち、それらのOSの場合にのみ名前空間stdを使用する場合。次のようにすることもできます。

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

お役に立てば幸いです。

于 2012-06-11T19:55:10.230 に答える
1

本当にしたくない場合は、これを行うことができるはずです#ifdef:

namespace std {}
using namespace std;

つまり、std名前空間を作成または拡張します。Linux では拡張し、HP-UX では作成します。いずれの場合usingも有効になります。

ただし、HP-UX コンパイラがあなたの言うとおり古い場合、C++ ヘッダー ファイルをインクルードするためのソース コードは古いスタイルである可能性があります。

#include <iostream.h>

モダンなスタイルの代わりに:

#include <iostream>

この問題の解決策がある場合は、コードのどこかで条件付きコンパイルを使用している可能性があります。using namespace stdこの種のプラットフォーム固有の決定をコード内の 1 つの場所にローカライズしている場合は、それを必要とするプラットフォームに対してのみ実行するコードを追加する場所になります。

于 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

LINUXまたはなどのプラットフォーム固有の定数を使用WIN32して、行を追加するかどうかを指定できますusing namespace stdconfig.hこれを行う通常の方法は、使用するプラットフォーム固有の型名のエイリアスを定義して、ファイルを作成 (または、より頻繁に生成) することです。

于 2012-06-11T19:47:00.613 に答える