wxWidgets を使用する C++ アプリがあります。アプリの特定の部分は、32 ビット ホストと 64 ビット ホストでは異なります。現在 sizeof(void *) を使用していますが、条件付きコンパイルを使用し、プラットフォームに依存しないより良い方法はありますか?
4 に答える
通常、人々は #defines を使用してビット数を決定します (正確な定義はコンパイラによって異なります)。これは、sizeof(void*) を使用したランタイム アプローチよりも優れています。
プラットフォーム ニュートラルに関しては、一部のコンパイラは複数のプラットフォーム上にあります..
コンパイラによっては、プラットフォーム固有のマクロにアクセスできる場合があります。ドキュメントを調べてみてください。
すべての一般的なコンパイラには、プラットフォームを識別する定義済みのプリプロセッサ マクロがあります。たとえば、GCC を使用している場合は、すべてを簡単に確認できます。
touch foo.h; g++ -E -dM foo.h
とりわけ得られるもの
#define linux 1
#define __x86_64 1
私にとっては、現在64b Linuxを使用しているため、
#define __APPLE__ 1
#define __i386 1
32b OS X だと聞きました。
Sun Studio 12 については、ここに記載されています。また、Sun Microsystems はそれらをコンパイラの API の一部と見なしているため、互換性が保証されています。たとえば、私の Solaris ボックスでは__SunOS_5_10
、__sparcv9
定義済み (64b を意味します) があります。
IBM xlc コンパイラーを備えた AIX システムでは、/etc/vac.cfg
とそのoptions
キーワード フィールドを調べて、事前定義されたマクロを見つけてください。私がアクセスできるシステムには、(64b PPC で) 定義されているものと同様に、少なくとも_AIX
より具体的なものがあります。_AIX61
_POWER
HP-UX とその aCC コンパイラには、少なくとも__ia64
itanium のマクロがあります。その他の aCC 固有の定義済みマクロについては、こちらに記載されています。
sizeof()
サイズが重要な場所で使用することの何が問題になっていますか? コンパイラは喜んでそれを定数に最適化します。