プリプロセッサのソースを表示
←
プリプロセッサ
移動先:
案内
、
検索
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
要求した操作を行うことは許可されていません。
このページのソースの閲覧やコピーができます。
'''プリプロセッサ'''('''preprocessor''')とは、一般にある処理を行う[[ソフトウェア]]に対して、データ入力やデータ整形などの準備的な処理を行うソフトウェアのことである。特に[[コンパイラ]]に対して使うことが多く、ここではそれを中心に述べる。 他の分野の例としては、[[CAD]]や[[CAE]]のデータ処理がある。また[[ワープロ]]ソフトウェアにおける[[漢字変換]]ソフトウェアもプリプロセッサの一例である。 ==コンパイラに対して== [[コンパイル]]処理において、'''プリプロセッサ'''('''preprocessor''')とは、コンパイラがソースコードをコンパイルする前に、一旦ソースコードに処理を施すための[[プログラム (コンピュータ)|プログラム]]である。 プリプロセッサによって実行される命令は「'''プリプロセッサ指令'''」([[ディレクティブ]])などと呼ばれ、処理自体は「'''プリプロセス'''」('''preprocess''')と呼ばれる。 ==処理内容== 以下のようなものがある。 * ファイルの読み込み (including) * [[マクロ (コンピュータ用語)|マクロ]]の展開(文字列を、あらかじめ定義された規則に従って置換する) * 定数の数値への置き換え * コンパイル条件によるソースコードの部分的選択 * コメントの削除 ==環境== プリプロセッサを用いる言語の代表的なものとして[[C言語]]がある。[[GNU]]プロジェクトのcppコマンドはよく使われているプリプロセッサである。cppコマンドを明に実行しなくても、C言語コンパイラのccコマンドやgccコマンドはその内部でプリプロセッサを先に実行させることができる。 また、言語仕様の貧弱な言語を構造化プログラミングができるようにしたものもある。[[ratfor]]([[FORTRAN]]のプリプロセッサ)が有名である。 そのほかにも、FORTRANや[[COBOL]]のプリプロセッサが商用のツールとして、メインフレーム向けに販売されている。 ==注意点== プリプロセッサを通すことを前提に記述されたプログラムは、コンパイラのあずかりしらない内容を含んでいることになる。このことは、たとえばマクロの定義と同じ文字列が全て変換されてしまったり、定数の型をチェックできなかったりと、問題の火種をはらんでいる。そのため、プリプロセッサを用いる場合には注意が必要である。 このような名前衝突の問題をさけるための対策としてマクロは大文字だけで記述し、それ以外の識別子は小文字をまぜるという慣習がある[http://www.libjingu.jp/trans/bs_faq2-j.html#Hungarian]。 [[C++]]の様に、言語自体の機能によって定数やインライン関数を記述可能な言語ではなるべく言語自体の機能を使い、プリプロセッサを排除して記述すべきだという意見が存在するが、[[互換性]]や慣習からプリプロセッサを利用した記述が行われる場面は依然多い。 また、プリプロセッサを積極的に用いて[[メタプログラミング]]を行うといった高度な用法もある。 <!--↓ここ以下、コメントアウトした部分、ぜんぜん「プリプロセッサ」一般の話題じゃない。C言語の記事なりなんなりに書くべき内容。--><!-- ==C, C++における大文字の慣習== C, C++において一部の例外を除き、マクロで定義した識別子は、大文字とアンダーラインで記述することが慣例となっている。逆にマクロ以外で定義した変数名や関数名は、小文字を混ぜる事が慣例となっている。これは、マクロと他の識別子を干渉させないためである。他の言語の様に定数だからという理由ではない。そのため、例え列挙型の識別子や、constで宣言した定数、typedefした型の名前であっても[http://www.libjingu.jp/trans/bs_faq2-j.html#Hungarian "絶対に全て大文字で記述してはならない。"]逆に、マクロで定義した識別子においても、小文字を混ぜるようなことをしてはいけない。 問題となった事例として、オフィススウィートやOSなどで知られる、ある有名ソフトメーカーが提供したライブラリの min(), max() マクロが有名である。この事例では、使うべきではない小文字のマクロを使用したためC++のstd::min()関数やstd::max()関数を上書きしてしまうという問題が発生している。こちらはマクロ側から棲み分けを破ってしまった対照的な例である。 const宣言した定数や列挙型の識別子について、こちらも他のライブラリがマクロで同じ識別子を定義していた場合は、他の識別子と同様上書きされる。この時コンパイラは、上書きした事について警告を出さないため、気づかなければバッファーオーバーランなど大きなバグを孕む危険性がある。 ==C, C++のプリプロセッサ指令の例== ===#include=== [[ヘッダーファイル]]の読み込み。 <source lang="c"> #include "ヘッダーファイル名" #include <ライブラリ名> </source> ===#define=== ソースコードから特定のテキストを検索/置換。 <source lang="c"> #define 検索文字列 置換文字列 </source> --> == 関連項目 == * [[m4 (プログラミング言語)]] ==外部リンク== *[http://gcc.gnu.org/onlinedocs/cpp/index.html#Top The C Preprocessor] - gnu.org(英語)、 :[http://www.sra.co.jp/public/sra/product/wingnut/gcc/cpp-j.html The C Preprocessor] その和訳- 株式会社SRA <small> <span style="color:#a0a000">(※ 漢字が化ける場合はブラウザの表示オプションのエンコードで日本語EUC(=EUC-JP)コードを指定して閲覧する) </span> </small> *[http://msdn2.microsoft.com/ja-jp/library/y4skk93w(en-us).aspx マイクロソフトVisual C/C++ プリプロセッサ・リファレンス](日本語) [[Category:プログラミング|ふりふろせつさ]] [[Category:CAD|ふりふろせつさ]] [[Category:CAE|ふりふろせつさ]]
プリプロセッサ
に戻る。
案内メニュー
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
その他
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
新しいページ
最近の更新
おまかせ表示
sandbox
commonsupload
ヘルプ
ヘルプ
井戸端
notice
bugreportspage
sitesupport
ウィキペディアに関するお問い合わせ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報