「C言語/前処理指令」の版間の差分

削除された内容 追加された内容
.旻 (トーク | 投稿記録)
書き換えツールのコピペミス
節「概要」の追加、脚注の位置などを修正
1 行
== 概要 ==
<ref>『JISX3010:2003』p.6「5.1.1.2 翻訳フェーズ」</ref>
<ref>『JISX3010:2003』p.110「6.10 前処理指令」</ref>
 
前処理指令とは、#前処理字句で始まり、それに続く最初の改行文字で終わる一連の前処理字句である。
前処理指令は、翻訳フェーズの(4)において実行される。
<ref>『JISX3010:2003』p.110「6.10 前処理指令」</ref>
前処理指令によって、
ソースファイルの一部分を条件によって処理したり読み飛ばしたり、
11 ⟶ 10行目:
 
== 条件付き取り込み ==
<ref>『JISX3010:2003』p.112「6.10.1 条件付き取り込み」</ref>
 
条件付き取り込みとは、ソースファイルの一部分を条件によって処理したり読み飛ばしたりする前処理指令である。
 
25 ⟶ 22行目:
#endif
</source>
 
 #if,#elif,#elseは、それぞれ制御文のif,else if,elseと同様の使い方をする。
すなわち、定数式1が真(0以外)の場合グループ1が実行され、
63 ⟶ 61行目:
#endif
</source>
 
<ref>『JISX3010:2003』p.112「6.10.1 条件付き取り込み」</ref>
 
=== インクルードガード ===
86 行
 
== ソースファイル取り込み ==
<ref>『JISX3010:2003』p.113「6.10.2 ソースファイル取り込み」</ref>
 
ソースファイル取り込みとは、他のソースファイルを取り込む前処理指令である。
 
96 ⟶ 94行目:
#include "q文字列"
</source>
 
 #indlude前処理指令は、
h文字列ではヘッダを、q文字列ではソースファイルをそれぞれ取り込む。
「#include "q文字列"」の探索をサポートしていない場合や、探索が失敗した場合は、
同じ文字列を「#include <h文字列>」と読み替えたのと同じ規則で再処理する。
<ref>『JISX3010:2003』p.113「6.10.2 ソースファイル取り込み」</ref>
 
== マクロ置き換え ==
<ref>『JISX3010:2003』p.114「6.10.3 マクロ置き換え」</ref>
 
マクロ置き換えとは、マクロ名を置換要素並びで置き換える前処理指令である。
マクロ置き換えには、オブジェクト形式マクロと関数形式マクロがある。
 
*オブジェクト形式マクロ
126 ⟶ 123行目:
置換要素並びで置き換える(マクロ呼出し)。
 
<ref>『JISX3010:2003』p.114「6.10.3 マクロ置き換え」</ref>
=== 実引数置換 ===
<ref>『JISX3010:2003』p.116「6.10.3.1 実引数置換」</ref>
 
=== 実引数置換 ===
実引数置換とは、関数形式マクロの実引数を識別した後行われ、
実引数の中に含まれるすべてのマクロの展開後、
139 ⟶ 136行目:
置換要素並びの中に現れる識別子__VA_ARGS__は、それが一つの仮引数であるかのように扱われなければならない。
それを、可変個数の実引数が形成する前処理字句列で置き換える。
 
<ref>『JISX3010:2003』p.116「6.10.3.1 実引数置換」</ref>
 
=== #演算子 ===
<ref>『JISX3010:2003』p.116「6.10.3.2 #演算子」</ref>
 
 #演算子は、文字列化演算子と呼ばれ、
関数形式マクロの置換要素並びの中の仮引数の直前に付けることができ、
#前処理字句と仮引数を、実引数を「"」で囲んだ単純文字列リテラルで置き換える。
その際、「"」文字及び「\」文字の前に、「\」文字が挿入される。
<ref>『JISX3010:2003』p.611656.110.13.2 翻訳フェーズ#演算子」</ref>
 
=== ##演算子 ===
<ref>『JISX3010:2003』p.116「6.10.3.3 ##演算子」</ref>
 
 ##演算子は、トークン連結演算子と呼ばれ、
オブジェクト形式マクロ又は関数形式マクロの置換要素並びの中で使われ、
156 ⟶ 153行目:
仮引数の直前又は直後に##前処理字句がある場合、
その仮引数を対応する実引数で置き換える。
<ref>『JISX3010:2003』p.116「6.10.3.23 ##演算子」</ref>
 
=== 再走査と再置き換え ===
<ref>『JISX3010:2003』p.117「6.10.3.4 再走査と再置き換え」</ref>
 
実引数置換、#演算子及び##演算子の処理、プレースマーカー前処理字句の削除を行った後、
さらに置き換えるべきマクロ名があるかどうかを調べるために、
172 ⟶ 168行目:
前処理指令として処理することはない。
 
<ref>『JISX3010:2003』p.117「6.10.3.4 再走査と再置き換え」</ref>
=== マクロ定義の有効範囲 ===
<ref>『JISX3010:2003』p.117「6.10.3.5 マクロ定義の有効範囲」</ref>
 
=== マクロ定義の有効範囲 ===
マクロ定義の有効範囲は、そのマクロ定義から、対応する#undef指令を検出するまで又は前処理翻訳単位の最後までである。
 
183 ⟶ 179行目:
識別子で無効にしたいマクロ名を指定する。
 
<ref>『JISX3010:2003』p.117「6.10.3.5 マクロ定義の有効範囲」</ref>
== 行制御 ==
<ref>『JISX3010:2003』p.120「6.10.4 行制御」</ref>
 
== 行制御 ==
行制御とは、この指令の次のソース行の行番号を指定する前処理指令である。
行制御の記述は、次の2通りがある。
208 ⟶ 204行目:
一致した形式の規則に従って処理する。
 
<ref>『JISX3010:2003』p.120「6.10.4 行制御」</ref>
== エラー指令 ==
<ref>『JISX3010:2003』p.121「6.10.5 エラー指令」</ref>
 
== エラー指令 ==
エラー指令とは、処理系に対し、
指定された前処理字句の列を含む診断メッセージを出力することを指示する前処理指令である。
218 ⟶ 214行目:
</source>
前処理字句列で出力する診断メッセージを指示する。
<ref>『JISX3010:2003』p.121「6.10.5 エラー指令」</ref>
 
== プラグマ指令 ==
<ref>『JISX3010:2003』p.121「6.10.6 プラグマ指令」</ref>
 
プラグマ指令とは、処理系に対し処理系定義の方法で動作することを指示する前処理指令である。
処理系が認識できないプラグマ指令は、無視する。
228 ⟶ 223行目:
#pragma 前処理字句列
</source>
<ref>『JISX3010:2003』p.121「6.10.6 プラグマ指令」</ref>
 
詳しくはコンパイラのヘルプを参照せよ。
 
== 空指令 ==
<ref>『JISX3010:2003』p.121「6.10.7 空指令」</ref>
 
空指令とは、何の効果もない前処理指令である。
空指令の記述は次のようになっている。
239 ⟶ 233行目:
#
</source>
<ref>『JISX3010:2003』p.121「6.10.7 空指令」</ref>
 
== あらかじめ定義されたマクロ名 ==
<ref>『JISX3010:2003』p.121「6.10.8 あらかじめ定義されたマクロ名」</ref>
 
あらかじめ定義されたマクロ名がある。
そのマクロ名と意味は次のようになっている。
271 ⟶ 264行目:
|}
 
<ref>『JISX3010:2003』p.121「6.10.8 あらかじめ定義されたマクロ名」</ref>
== プラグマ演算子 ==
<ref>『JISX3010:2003』p.122「6.10.9 プラグマ演算子」</ref>
 
== プラグマ演算子 ==
プラグマ演算子は、指定した文字列リテラルを文字列解除し、その結果をプラグマ指令の中の前処理字句列として実行する。
つまり、次の形式の指令は、その次の形式でも表現できる。
280 ⟶ 273行目:
_Pragma("listing on \"..\\listing.dir\"")
</source>
<ref>『JISX3010:2003』p.116122「6.10.3.39 ##プラグマ演算子」</ref>
 
== 脚注 ==
<references/>
 
== 参考文献 ==
*日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正
 
[[Category:C言語]]