• ベストアンサー

X86/MIPSクロス環境での開発

X86/MIPSクロス環境でソフトを開発している者です。 ネットで検索したところ、 #ifdef __mips__ ~MIPS環境での処理~ #else ~X86環境での処理~ #endif とすれば切替えられそうなことが分かりました。 でも、このプリプロはどこで定義されているのでしょうか。 未定義の環境があると他の手段を考える必要がありますよね? 御存じの方、ご教授よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.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で問題ありません。 ■参考 多くのオープンソースプロジェクトは、共通ヘッダで環境を切り替えるためのマクロ定義をやっています。 そのヘッダを見れば、主要な処理系/環境で組込マクロの判定をしていますので、どんな環境では何が定義されるかの参考になると思います。

その他の回答 (2)

  • smat7
  • ベストアンサー率46% (7/15)
回答No.2

>でも、このプリプロはどこで定義されているのでしょうか 事前定義マクロというものでコンパイラが自動で定義します 詳細はコンパイラの仕様書に記載さています 例えばARMのコンパイラなら __arm というのが自動に定義されます 他にコンパイラのバージョンを定義しているマクロなどもあります ASSERTの表示で使われる __FILE__, __LINE__ というのもこの一種です WINDOWS上のコンパイラなら _WIN32 というのもあったように記憶しています

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

多くのコンパイラで、このような場合は、 コンパイラオプションからdefine 名を渡すことができます。

関連するQ&A

  • #ifdef の使い方

    組み込み系のプログラムを現在勉強しています。 #ifdefについて質問させて頂きます。 下記コードの場合 #ifdef A ---- (1) Y = Z; #else -----#if B ------- (2) X = Z; ----#endif #endif ("-"は空白と思ってください。) この場合、Aが定義されていれば(1)が実行しコンパイル終了(#endif)。 Aが定義されていない場合、#else に行き、Bが定義されている場合は (2)を実行してコンパイル終了(#endif)という理解であっていますか? またこうした方が分かりやすいなど、アドバイス頂けると幸いです。 ご返答よろしくお願いします。

  • #if

    #if defined(DECRYPTION_KEY_SCHEDULE) #if DEC_ROUND == NO_TABLES #define ff(x) (x) #else #define ff(x) inv_mcol(x) #ifdef dec_imvars #define d_vars dec_imvars #endif #endif 上の部分をコンパイルすると、 'ff'マクロが再定義されました というエラーメッセージが出るのですが、 なぜ再定義になるのか分かりません。  OS:Win2000 コンパイラ VC++ 6.0 以前は、同じようなエラーが出て、 #else を使わないで全て書き直しました。  よろしくお願いいたします。

  • 動作環境MacOS X の アプリケーション開発

    MacOS Xを対象としてアプリケーションを開発するのですが、 どのような言語を利用すればいいかアドバイスをお願い致します。 動作としては、複数枚の画像を選択して画像の回転・反転を行い、指定したキーワードを元にリネーム。所定のフォルダに保存といった処理を自動で行うものです。 GUIでのインタフェースを必要としています。 上記のようなアプリケーションを開発する場合、 どの言語を選択すればいいのでしょうか? 言語の習得の有無は問いません。 できれば、開発環境がwindowsでも可能なものがあれば教えて下さい。 見当違いな質問かもしれませんが、ご教授の程、宜しくお願いします。

  • linuxでのアプリ開発環境

    やはりwindows向けmac向けのソフトをツクルなら、そのためのosが必要ですよね。だとしたらクロスプラットフォームの開発環境である、electronやWEBアプリに絞るといいでしょうか?

  • Verilog_HDLでのdefineとifdef

    yahooやgoogleで念入りに調べたつもりですが、自分の求めているようなHPは見つからなかったので、こちらの掲示板に記載させて頂きます。 すみませんが、誰かVerilog_HDLに詳しい方ご教授願いますでしょうか。 (1)「define」と「parameter」の用途の違いについて。 (2)「`ifdef」文と「if」文の用途の違いについて。 (3)「ifdef」の"def"は「define」の意味でしょうか。 -「define」の意の場合、「`ifdef <define_name>」のように<>の記述はdefineで定義された変数しか使用できないのでしょうか。 (4)下記例のように"test1/2"に定義値を持たせない場合は、どのようにして"test1/2"に値をアサインすれば宜しいのでしょうか。 サンプル記述例) `define test1 //定義値なしのdefine `define test2 `ifdef test1 //test1を真・偽させたい。 ------ `elsif test2 //test2を真・偽させたい。 ------ `endif (5)「ifdef」や「task」は、合成目的ではないテストベンチ等に使用するものと思っていましたが、「ifdef」や「task」を用いて組み合わせ回路等を開発したりするのでしょうか。 以上です。 すみませんが何方か宜しくお願いします。

  • 正常時のログ出力方法(#ifdef DEBUGLOG使用)

    ret = syori(); if(ret != 0){ /* 異常終了(≠0)時 */ printf("error\n"); } という処理があった場合、defineでDEBUGLOGを定義している時は正常終了のメッセージを出すようにしたいと思っています。 そこで質問なのですが、 1.以下のような処理にすると問題があるのでしょうか?「else」の部分があまり好ましいと思えなくて・・・ ret = syori(); if(ret != 0){ /* 異常終了(≠0)時 */ printf("syori() エラー発生\n"); } #ifdef DEBUGLOG else { printf("syori() 正常終了\n"); } #endif 2.1.で記述した方法よりスマートな方法・より良い方法がありましたら教えていただけないでしょうか? よろしくお願いします。

  • コンパイル時のスイッチについて

    C言語初心者なので申し訳ありませんが,コンパイル時のスイッチについて困っております. 現在, #define tmp ... #ifdef tmp  関数1 #else  関数2 #endif とtmpを定義して切り替えようとしております. 現在コンパイルの切替は,毎回 //#define tmp とコメントアウトして切り替えているのですが, gcc等のコンパイラのコマンドラインから 切り替える方法はあるのでしょうか. 色々調べたら, cc -D tmp みたいな?感じにするのかと思ったのですがうまくいきません. 初歩の質問ですがご教授よろしくお願いします.

  • DirectX開発中のinclude ファイルを開けません。

    DirectX開発中に c:\documents and settings\a022\my documents\visual studio 2008\projects\map\map\stdafx.h(10) : fatal error C1083: include ファイルを開けません。'WinLib.h': No such file or directory MapModel.cpp 上のソースコードは、 #ifdef _MSC_VER // 警告の抑制 #pragma warning(disable: 4201) #pragma warning(disable: 4100) #pragma warning(disable: 4786) #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x400 #endif #include <WinLib.h> ←ここがよめないらしい というエラーが出ます。 解決法がわかる方はお教えください。

  • フレームワークは言語or開発環境?

    IT技術者向けの求人サイトを管理していますが、HTML程度の知識しかありませんのでご教授願います。 要求される技術を「言語」と「開発環境」に分けて表示しており、それぞれで絞り込み検索ができます。 ASP.NETなどのフレームワークの類は、どちらに分類されているほうがしっくりきますか? あるいは、あえて表示するほどの情報でもないでしょうか? よろしくお願いいたします。

  • 空のフォルダの判定

    お世話になります。 開発環境:VisualBasic.net 2005 名前を指定したフォルダが空のフォルダであるならばそのフォルダを削除し、 ファイルが存在すれば処理を行う。 という記述を書こうとしているのですが、 どのように書いてよいのか悩んでいます。 If フォルダ名=からのフォルダであるか Then ***フォルダの削除処理*** Else ***処理*** EndIF 1.指定フォルダの中のファイルを一覧表示し、一覧に何も表示されなかったTrueとする 2.IO.Directory.Delete("C:\TestFolder")  でエラーが帰ってこなければTrueとする 3.何か適切な関数があるかもしれないので探してみる ということを考えたのですが、最適な方法があればご教授お願いいたします。

専門家に質問してみよう