LinuxとWindowsでの実行をサポートするプロジェクトを維持する必要があります。このようなプリプロセッサディレクティブを使用しているいくつかのコードは問題ありません。プリプロセッサディレクティブを避けるためのC++クロスプラットフォーム開発
#ifdef _WIN32 // _WIN32 is defined by Windows 32 compilers
#include <windows.h>
#else
#include <unistd.h>
#endif
しかし実際にはプリプロセッサディレクティブを使用しないようにする実装もあります。
void Foo()
{
#ifdef _WIN32 // _WIN32 is defined by Windows 32 compilers
code for windows
#else
code for Linux
#endif
some common code...
#ifdef _WIN32 // _WIN32 is defined by Windows 32 compilers
code for windows again
#else
code for Linux again
#endif
}
物事は複雑になり、維持するのが難しくなります。もっと良い方法はありますか?
インターフェイス+抽象化レイヤプラットフォーム固有のコードが、現在ビルドしているプラットフォームに基づいてビルドシステムによって除外できる実装ファイルに含まれています。 – Chad
現実世界の例が必要な場合は、Doom3ソースを見てみるとよいでしょう。@Chadが説明したものと似ています。 https://github.com/TTimo/doom3.gpl/tree/master/neo/sys –
標準ライブラリを守ることは、あなたにとって長い道のりです。私がこれまで取り組んできた最も普及したマルチプラフォームプロジェクトは、11の異なるターゲットを対象としていました。最終的には避けることができないものがいくつかあります(AS/400上の動的ライブラリロードなど)。信じることを見て)。他に何も利用可能でない限り、プラットフォームごとに '#ifdef'コーディングを避けてください。あなたがそれを他の選択肢のないシナリオと見なしている場合は、*機能*ベースでそれを実行してください。 Ex。あなたのコード: '#ifdef HAS_STDINT_H'など – WhozCraig