プロが教えるわが家の防犯対策術!

X86/MIPSクロス環境でソフトを開発している者です。
ネットで検索したところ、

#ifdef __mips__
~MIPS環境での処理~
#else
~X86環境での処理~
#endif

とすれば切替えられそうなことが分かりました。
でも、このプリプロはどこで定義されているのでしょうか。
未定義の環境があると他の手段を考える必要がありますよね?
御存じの方、ご教授よろしくお願い致します。

A 回答 (3件)

■マクロの定義位置について



処理系は通常「組込マクロ」を暗黙に定義します。
定義されるのはただのマクロですが、通常ヘッダ等には定義がありません。何が定義されるかは、処理系のマニュアルに書いてあります。
提示のマクロは、処理系の組込マクロと思われます。

■マクロの標準定義について

_ で始まる識別子は、言語仕様で処理系等のために予約されています。
このうち、いくつかのマクロは、言語仕様で定義が保証されます。(例:__FILE__, __LINE__, ...)
逆に、それ以外は処理系や環境の独自定義です。
(例:_WIN32, _MSC_VER, __BORLANDC__, __WATCOMC__,_M_IX86, ...)

■__mips__ について

提示の __mips__ は、何からの MIPS 用処理系で組込マクロとして定義されているものと思われます。
大抵のコンパイラは何らかの名前で類するマクロを定義していますが、その名前に標準はありません。
同名のマクロを定義しているかもしれませんし、ある処理系では _MIPS_ とかかもしれません。

■__mips__ 未定義の MIPS 環境における回避策について

仮に __mips__ が定義されていない場合、既に提示のあるように、コンパイルオプションで強制的に定義することもできます。
また、限定的なパターンが推測できるなら、予め対応を取っておくことも有効かと思います。
#if !defined(__mips__) && (defined(_mips_) || defined(_mips) || defined(_MIPS_)) // ... その他、ありそうなパターン列挙
#define __mips__
#endif

■ X86 環境について

__mips__ でないから X86 というのは少々乱暴かと思います。
CPU の種類はもっとあります。(例:ARM, PPC, SPARC,...)
おそらく、各環境で __mips__ に相当する __x86__ 等が定義されていると思いますので、X86依存部はそれを参照することをお勧めします。
「~X86環境での処理~」と書かれている部分が、実は環境非依存部なら提示のifdefで問題ありません。

■参考

多くのオープンソースプロジェクトは、共通ヘッダで環境を切り替えるためのマクロ定義をやっています。
そのヘッダを見れば、主要な処理系/環境で組込マクロの判定をしていますので、どんな環境では何が定義されるかの参考になると思います。
    • good
    • 0

>でも、このプリプロはどこで定義されているのでしょうか



事前定義マクロというものでコンパイラが自動で定義します
詳細はコンパイラの仕様書に記載さています

例えばARMのコンパイラなら __arm というのが自動に定義されます
他にコンパイラのバージョンを定義しているマクロなどもあります
ASSERTの表示で使われる __FILE__, __LINE__ というのもこの一種です

WINDOWS上のコンパイラなら _WIN32 というのもあったように記憶しています
    • good
    • 0

多くのコンパイラで、このような場合は、


コンパイラオプションからdefine 名を渡すことができます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!