C マクロ 新しいページはコチラ
提供: yonewiki
(→#define) |
(→#define) |
||
72行: | 72行: | ||
</syntaxhighlight> | </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'''=== | ==='''#undef'''=== |