C++ ソース コードを HP-UX から Linux に移植しようとしているときに、この問題が発生しました。Linux で C++ ソース コードをコンパイルしようとすると、コンポーネント (標準 C++ ライブラリから) が存在しないというメッセージが表示されます。名前空間 std; を使用して行を配置します。ソースコードの上部にある は、問題を解決しているようです。HP-UX でコードを再コンパイルしようとすると、aCC コンパイラはここではネームスペース名のみが有効であると不平を言います (std は有効なネームスペースとは見なされません)。この問題を回避して、ソース コードが HP-UX の長く非推奨の C++ コンパイラと LINUX の GCC コンパイラの両方とバイナリ互換になるようにする方法があるかどうか疑問に思っていました。
5 に答える
プリプロセッサを使用して、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
お役に立てば幸いです。
本当にしたくない場合は、これを行うことができるはずです#ifdef
:
namespace std {}
using namespace std;
つまり、std
名前空間を作成または拡張します。Linux では拡張し、HP-UX では作成します。いずれの場合using
も有効になります。
ただし、HP-UX コンパイラがあなたの言うとおり古い場合、C++ ヘッダー ファイルをインクルードするためのソース コードは古いスタイルである可能性があります。
#include <iostream.h>
モダンなスタイルの代わりに:
#include <iostream>
この問題の解決策がある場合は、コードのどこかで条件付きコンパイルを使用している可能性があります。using namespace std
この種のプラットフォーム固有の決定をコード内の 1 つの場所にローカライズしている場合は、それを必要とするプラットフォームに対してのみ実行するコードを追加する場所になります。
正しいヘッダーが含まれていることを確認してください。C++ は、どの標準ヘッダーが他の標準ヘッダーをインクルードできるかを定義していないため、間接インクルードを使用すると、実装の動作が異なります。したがって、含める必要があるすべてが直接含まれていることを確認してください。
using namespace std;
使用する名前を完全に修飾したり、using
必要な特定のコンポーネントを呼び出す宣言を使用したりしないでください。using std::string; string s; // no need for using namespace std
LINUX
またはなどのプラットフォーム固有の定数を使用WIN32
して、行を追加するかどうかを指定できますusing namespace std
。config.h
これを行う通常の方法は、使用するプラットフォーム固有の型名のエイリアスを定義して、ファイルを作成 (または、より頻繁に生成) することです。