C言語のマクロについてです。C言語のマクロには落とし穴が多いので、マクロをマスターして引っかからないようにしましょう。そしてC言語の達人になってください。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング言語において、
マクロとは、プログラム中の文字列を
特定の規則にしたがって置換することをいいます。
C言語にもマクロ機能があり、大きく2種類に分かれます。
1つはオブジェクト形式マクロで、
もう1つは関数マクロと呼ばれます。
オブジェクト形式マクロは、
おもにプログラム中の定数を置換するために使用されます。
関数マクロは関数の代用として使用されます。
C言語のマクロ機能には、長所と短所があり、
それを理解した上で使用することが重要です。
PR
オブジェクト形式マクロは単純な字句の置き換えです。
例えば、次のようなものです。
#define MIN 50
このような記述をプログラムの先頭で行っておくと、
コンパイルの前に行われるプリコンパイルで、
それ以降のプログラム中のMINという字句が、
50に置き換えられます。
(その後コンパイルが行われます)
このようにしておけば、
後々、MINの値が変更になった場合、
#defineで指定した値を変更するだけで、
プログラム中の全てのMINの値が自動的に変更され、
たいへん便利です。
また、プログラム中に50という値を
直接書いてしまうと、その値の意味が
わかりにくくなってしまいます。
オブジェクト形式マクロにしておけば、
50がMIN、すなわち最小値であることが
すぐにわかります。
オブジェクト形式マクロで定めた定数を
記号定数と呼びます。
C言語のマクロは
引数を取ることもできます。
そのようなマクロを関数マクロと呼びます。
次の形式で記述します。
#define マクロ名(引数) 置き換えられる字句
「置き換えられる字句」の中で引数を使用できます。
例を見てみましょう。
#define MAX(a,b) ((a) > (b) ? (a) : (b))
このようにプログラムの先頭部分で定義しておくと、
コンパイルの前に行われるプリコンパイルで、
それ以降のプログラム中のMAXという字句が、
((a) > (b) ? (a) : (b))に置き換えられます。
もとの字句がMAX(100,x+1)であったなら、
((100) > (x+1) ? (100) : (x+1))
と置き換えられます。
関数マクロは、関数と異なり、
引数の型が固定されません。
また、マクロ置換が行われるので、
関数呼び出し時のオーバヘッドがありません。
このように便利な関数マクロですが、
マクロ使用時のパラメータで
インクリメントやデクリメントを行うと、
それが複数回行われるケースがある等、
不具合を発生させる危険もあります。
(マクロの副作用といわれています)
関数マクロは注意して使用する必要があります。
ブログ内検索
最新記事
(03/31)
(03/31)
(03/30)
(03/30)
(03/30)
最古記事
(03/23)
(03/24)
(03/25)
(03/26)
(03/27)