ソースコード(=テキスト)をコンパイル前に、テキストとして置換し、
コンパイル前に新しいソーステキストを生成するのがマクロです。
文字列なので、何でもアリです。評価などしませんし、無条件に置換されます。
#define func(param) 記述(テキストなら何でもいい)
のかたちを取ることで、呼び出しの時に引数を取ることができます。
func(param) から空白を1つ置くことで、その次が置換される表現として認識されます。
のように、引数を取ることができます。
もちろん型はありませんし、評価もされませんし演算もされません。
予約語であっても演算子であっても何であっても
すべてただのテキストして扱われるのです。
引数のparamの部分も、マクロが実行された時に+1されることなどありません。
全てコンパイル前のテキスト処理です。
例1に対しプリプロセッサの処理が行われたとすると、
プリプロセス後のソースコードは
1
2
3
4
5
| - | | ! |
|
となります。MACRO(a+4) があった位置の文字列が置き換えられています。
結果は
答えは:12
になります。
もし、例1で
としていたらどうでしょうか
この場合、プリプロセスによってソースコードは
1
2
3
4
5
| - | | ! |
|
になり、結果は
答えは:10
になります。
マクロ演算子 | 意味 |
---|---|
## | パラメータ文字を連結 |
# | パラメータ文字を文字列定数表現("string")に変換 |
¥¥ | マクロ定義中での改行 |