忍者ブログ
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))

と置き換えられます。

関数マクロは、関数と異なり、
引数の型が固定されません。
また、マクロ置換が行われるので、
関数呼び出し時のオーバヘッドがありません。

このように便利な関数マクロですが、
マクロ使用時のパラメータで
インクリメントやデクリメントを行うと、
それが複数回行われるケースがある等、
不具合を発生させる危険もあります。
(マクロの副作用といわれています)

関数マクロは注意して使用する必要があります。
ブログ内検索
バーコード
アーカイブ

Copyright © [ C言語のマクロ ] All rights reserved.
Special Template : 忍者ブログ de テンプレート
Special Thanks : 忍者ブログ
Commercial message : [PR]