さまざまな回答からわかるように、このトピックはかなり複雑です。ここで、3 つのプラットフォーム (msvc 8/Windows、gcc 4.2/Linux、gcc 3.4/embedded ARM9 プロセッサ) を対象とするコードを最近移植したときに直面した問題のいくつかを以下に示します。もともとは Visual Studio 2005 でしかコンパイルできませんでした。
a) Windows プラットフォームで記述された多くのコードは、windows.h で定義された型を使用します。次の内容を含む「windows_types.h」ファイルを作成する必要がありました。
#ifndef _WIN32
typedef short INT16;
typedef unsigned short UINT16;
typedef int INT32;
typedef unsigned int UINT32;
typedef unsigned char UCHAR;
typedef unsigned long long UINT64;
typedef long long INT64;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef void * HANDLE;
typedef long LONG;
#endif
醜いですが、以前は Windows のみを対象としていたコードを変更するよりもはるかに簡単です。
b) テンプレート化されたコードでは、型を宣言するために typename キーワードは必要ありませんでした。MSVC はこの点で緩いです (特定のコンパイラ スイッチが警告を生成したと思いますが)。数か所に追加する必要がありました。
c) 単純だが時間がかかる: Windows では大文字と小文字が区別されず、多くの #include ファイルが大文字と小文字を正しく指定せずに指定され、Linux で問題が発生しました。
d) 多くの目的で Windows API を使用するかなりの量のコードがありました。CRITICAL_SECTIONS と INTERLOCKED_INCREMENT の例です。これらの問題を置き換えるためにできる限りブースト ライブラリを使用しましたが、コードの修正には時間がかかります。
e) コードの多くは、プリコンパイル済みヘッダーに含まれるヘッダーに依存していました。gcc3.4 で pch を使用する際に問題が発生したため、すべての .h/cpp ファイルにすべての依存関係が正しく含まれていることを確認する必要がありました (最初に含まれている必要があります)。
f) VS 2005 には厄介なバグが 2 つあります。 auto_ptr は何にでも割り当てることができ、一時変数は参照パラメーターに渡すことができます。どちらも (ありがたいことに!) gcc ではコンパイルに失敗しますが、やり直しが必要です。
g) 奇妙なことに、クラステンプレート関数を明示的に特殊化しようとするテンプレート コードがありました。禁止されている。再び gcc は拒否し、VS 2005 はそれを手放しました。問題が理解されれば、通常のオーバーロードに簡単に作り直すことができます。
h) VS 2005 では、std::exception を文字列で構築できます。gcc または標準では許可されていません。派生例外クラスのいずれかを使用するようにコードを修正します。
うまくいけば、それはあなたが探していた種類の情報です!