2009-07-13 16 views
6

私は、iPhone、Windows、Linux、Mac、Symbian S60などのかなり異なるプラットフォームでビルドできるようにするために、C++で小さなライブラリを作成しています。ほとんどのコードをプラットフォームに依存しないように記述しましたが、プラットフォームごとに記述する必要がある部分があります。プラットフォームCプリプロセッサの定義

現在、私は現在のプラットフォームに応じて異なるヘッダーを含めることでこれを達成しますが、すべてのプラットフォームでどのようなプリプロセッサ定義が定義されているかわからないため、この問題を解決できません。ウィンドウの場合、私は一般的にWIN32または_WIN32を見ることに頼ることができます。 Linuxの場合、私は_UNIX_を見ることに頼ることができますが、他のプラットフォームやその64ビット版についてはあまり確信がありません。誰もがプラットフォーム上で見つかったさまざまな定義のリストを持っているのですか、またはconfigファイルまたはgccパラメータに頼らなければなりませんか?

答えて

9

私はページをブックマークに登録しています。

+0

Googleはいつも古いバージョンを指していますが、最新のwiki化バージョンを指すようにリンクを編集しました。 – rubenvb

+0

それは大丈夫です、ありがとう。 –

0

CやC++標準ではこのようなシンボルは定義されていないため、特定のCまたはC++実装を慈悲にすることになります。一般的に使用されているシンボルのリストは有益なものですが、残念ながら私は持っていません。

0

プラットフォームの普遍的なリストは、私が見たクロスプラットフォームのライブラリはすべてこれらのものでいっぱいのアドホックなconfig.hを持っているという事実から判断して定義しているとは思えません。しかし、あなたはここでlibpng

0

定義が純粋にあなたのコンパイラベンダまであることを行っているで使用されるものです

のzlibなど、libpngのようにかなりのポータブルライブラリで使用されているものを見て検討することができます。すべてのプラットフォームで同じコンパイラ(gccなど)を使用している場合は、少し時間がかかります。

代わりに、ほとんどの.hファイルがプラットフォームに依存しないようにプロジェクトを編成することもできます。実装(cppファイル)を別々のファイルに分割します。 1つは非特異的なもの用で、もう1つは各プラットフォーム用です。プラットフォーム固有のものには、そのプラットフォームにのみ意味を持つ「プライベート」ヘッダーを含めることができます。あなたは100%(システムライブラリが少し異なる引数をとるとき)のように何かを得るためにアダプタ関数を作らなければならないかもしれませんが、私はそれが最後に本当に役に立つと分かりました、そして新しいプラットフォームをもたらすことはずっと簡単です将来は。

0

あなたはGCC(例えば、MAC OS X、iOSの、Linuxなど)、あなたはこのように、コマンドラインからの完全なリストを取得することができます持っているに与えられたシステムのデフォルトのプリプロセッサシンボルに目を通すしたい場合:

echo 'main(){}' | cpp -dM 

これらは、しかし、プリプロセッサが動作するコンパイルの段階でのように、シンボルのほとんどは、むしろシステムよりコンパイラをホストしている唯一のシステム、のオペレーティングシステムやCPUの種類を識別し、多くの場合、限られた用途のです(例えば、iOS用のクロスコンパイル時)。 Mac OS XおよびiOSでは、対象とするシステムのコンパイル時の特性を決定するための正しい方法は、これはプラットフォームからTargetConditionals.hをピックアップし、現在使用されているSDK、その後、次のことができます

#include <TargetConditionals.h> 

ですマクロのいくつかからエンディアンとその他の特性を判断する(例)。 (TargetConditionals.hを見て、あなたが収集できる情報の種類を確認してください。)

+0

-dMの出力を調べることは助けになるかもしれませんが、predef sourceforge wikiページと同じくらい多くの情報を保証することはできません。 – rubenvb

関連する問題