C マクロのソースを表示
新しいページはコチラ
移動:
案内
,
検索
※このページではC言語にも存在していたという意味で記事タイトルがC マクロになっていますが、<br /> [[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> <br /> <big><big>'''マクロ'''</big></big> マクロはC++言語においては、プリプロセッサの中での変数を使ったプログラム全体のテキスト文字列の一括置換処理を行う処理のための命令を意味していて、#define ディレクティブによってマクロ変数を定義できます。 簡単な使い方から複雑な使い方であるものまで種々のマクロが存在するため、最初の基礎の理解だけに留めていると、複雑なマクロ変数や変数の定義であるマクロ宣言に出くわしたとき、理解に苦しむことになります。 <nowiki>#</nowiki>undef はマクロ変数を解放する(変数の定義を消去する)ためのディレクティブです。こちらは比較的使い方が簡単です。 ==='''#define'''=== まず、マクロの基本ですが、マクロ変数を定義するだけで、変数の中に入れる値を意識しない使い方は以下のとおりです。プログラム全体に関わる定数値処理や定型文法処理の切り替えが必要な時に活用することができます。サンプルでは一回だけの変換につかっているので実用的ではありませんが、変換の具体例を示すための強引なマクロ利用サンプルになっていることに留意して下さい。 '''<nowiki>#</nowiki>defeine マクロ変数名''' のように#defineの後の半角空白での区切りの後にマクロ変数名を記述することで定義できます。 具体的に __MY_MACRO__ というマクロ変数を定義する場合は以下のとおりとなります。 <syntaxhighlight lang="text"> #define __MY_MACRO__ </syntaxhighlight> マクロ変数には置き換えるべき値を代入することができて、プログラムソース中のマクロ変数をプログラムトークン処理に基づいて、一致する変数を代入された値に置き換えることができます。 例えば、__MY_MACRO__ を数値50に置き換える場合は <syntaxhighlight lang="cpp" line start="1"> #define __MY_MACRO__ 50 int main(){ int nMacroValue; nMacroValue = __MY_MACRO__ * 10; } </syntaxhighlight> というプログラムはプリプロセス処理によって <syntaxhighlight lang="cpp" line start="1"> int main(){ int nMacroValue; nMacroValue = 50 * 10; } </syntaxhighlight> に置き換えられ、nMacroValueの値は500になります。更に __MY_MACRO1__ に代入する値を 20 + 30 とした 同じ50でも __MY_MACRO2__ にカッコをつけて ( 20 + 30 ) にした場合とでは置き換え処理が異なるだけでなく、計算結果にも影響します。 具体的には以下の通りの違いになります。 <syntaxhighlight lang="cpp" line start="1"> #define __MY_MACRO__ 50 #define __MY_MACRO1__ 20 + 30 #define __MY_MACRO2__ ( 20 + 30 ) int main(){ int nMacroValue; nMacroValue = __MY_MACRO__ * 10; nMacroValue1 = __MY_MACRO1__ * 10; nMacroValue2 = __MY_MACRO2__ * 10; } </syntaxhighlight> は <syntaxhighlight lang="cpp" line start="1"> int main(){ int nMacroValue; nMacroValue = 50 * 10;//500 nMacroValue1 = 20 + 30 * 10;//積の計算が優先されるため 20 + 300 で 320 nMacroValue2 = ( 20 + 30 ) * 10; // カッコが優先されて 50 * 100 で500 } </syntaxhighlight> と上記のように変換されます。 さらに複雑なマクロとして引数リスト付きマクロ変数が定義できて、__MY_MACRO_ADD_(a,b) のようなマクロ変数を定義できて、パラメータを引数にしたマクロ置換の値をパラメータを使った値を記述できます。パラメータの数はメモリの許す限り、幾つでも定義できます。 文章で引数リスト付きマクロを説明しても具体的にはどういうものか想像できないので具体例をいかに示します。 <syntaxhighlight lang="cpp" line start="1"> #define __MY_MACRO_ADD_(a,b) ( a + b ) int main(){ int nMacroValue; int a = 20; int b = 30; nMacroValue = __MY_MACRO_ADD_(a, b) * 10; nMacroValue1 = __MY_MACRO_ADD_(90, 110) * 10; } </syntaxhighlight> という記述は変換されて <syntaxhighlight lang="cpp" line start="1"> int main(){ int nMacroValue; int a = 20; int b = 30; nMacroValue = (20 + 30) * 10; nMacroValue1 = (90 + 110) * 10; } </syntaxhighlight> と、こうなります。 さらに応用をきかせると引数は何回でも繰り返し使えるので、 <syntaxhighlight lang="cpp" line start="1"> #define __MY_MACRO_ADD_(a,b) ( a + b + a + b ) int main(){ int nMacroValue; int a = 20; int b = 30; nMacroValue = __MY_MACRO_ADD_(a, b) * 10; nMacroValue1 = __MY_MACRO_ADD_(90, 110) * 10; } </syntaxhighlight> という記述は変換されて <syntaxhighlight lang="cpp" line start="1"> int main(){ int nMacroValue; int a = 20; int b = 30; nMacroValue = ( a + b + a + b ) * 10;//a = 20,b = 30,(20 + 30 + 20 + 30) * 10 → 1000 nMacroValue1 = ( a + b + a + b ) * 10;// 4000 } </syntaxhighlight> と、こうなります。 もっと応用をきかせるとやや機能的なマクロを定義することも出来ます。 <syntaxhighlight lang="cpp" line start="1"> #define __MY_MACRO_MAX__(a,b) ( (a) > (b) ? (a) : (b) ) #define __MY_MACRO_SWAP__(a,b) {int c; c = a; a = b; b = c;} int main(){ int nMacroValue; int a = 20; int b = 30; nMacroValue = __MY_MACRO_MAX__(a, b) * 10; nMacroValue1 = __MY_MACRO_MAX__(90, 110) * 10; nMacroValue2 = __MY_MACRO_SWAP__(a, b) * 10; nMacroValue3 = __MY_MACRO_SWAP__(90, 110) * 10; } </syntaxhighlight> という記述は変換されて <syntaxhighlight lang="cpp" line start="1"> int main(){ int nMacroValue; int a = 20; int b = 30; nMacroValue = ( (a) > (b) ? (a) : (b) ) * 10;//a = 20, b = 30, //( (20) > (30) ? (20) : (30) ) * 10 → 300 nMacroValue1 = ( (a) > (b) ? (b) : (b) ) * 10;//a = 90, b = 110, //( (90) > (110) ? (90) : (110) ) * 10 → 1100 nMacroValue2 = {int c; c = a; a = b; b = c;} * 10;//a = 20, b = 30 //{int c; c ← 20; a ← 30; b ← c(20);} * 10 → 0 nMacroValue3 = {int c; c = a; a = b; b = c;} * 10;//a = 90, b = 110 //{int c; c ← 90; 90 ← 110; 110 ← c(90);} * 10 → 0 //コンパイル エラー } </syntaxhighlight> といった具合に複雑な計算式を当て込むことで、最大値や値の入れ替えした値を返却するマクロとしての機能を持つ置換処理をプログラムソース全体にわたって処理してくれます。。ただしトークンの置き換えでMAXに一致すると処理が変わる可能性があるため、マクロ名が重複しないようにする必要があることと、引数付きの複雑なプログラムソースを組み込んだマクロ定義によって使い方を間違えるとエラーになるケースが生じることにも注意が必要になります。 ==='''#undef'''===
C マクロ
に戻る。
個人用ツール
18.221.240.145
このIPアドレスのトーク
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ