C言語のマクロについてです。C言語のマクロには落とし穴が多いので、マクロをマスターして引っかからないようにしましょう。そしてC言語の達人になってください。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
関数マクロでは、引数を省略することができます。
省略するには__VA_ARGS__という識別子を使います。
#define PRINT_ERROR(...) (fprintf(stderr, __VA_ARGS__))
int a = 10;
PRINT_ERROR("a:%d\n", a);
上記のように、
仮引数を省略記号(...)を使い省略します。
省略された引数は、__VA_ARGS__で表されます。
引数を省略する場合、
マクロをコールする側の実引数の数が、
マクロ定義内の省略記号(...)を除いた引数の
数よりも多い必要があります。
省略記号に相当する実引数が
必ずないといけないということです。
__VA_ARGS__は、仮引数に省略記号を
用いた場合のみ使用できます。
PR
C言語で定数を定義する方法は、
オブジェクト形式マクロだけではありません。
const修飾する方法もありますし、
列挙定数を使う方法もあります。
それぞれ、特徴がありますので、
使い分けるとよいでしょう。
<記号定数>
例 :#define MAX 100
特徴:プリプロセス時に評価される。
メモリを消費しない。
アドレスが与えられない。
デバッグ時に参照できない。
コンパイラによる型チェックがない。
<列挙定数>
例 :enum { MAX = 100 };
特徴:intとして表現可能な値を持つ整数定数式を表現できる。
コンパイル時に評価される。
メモリを消費しない。
アドレスが与えられない。
デバッグ時に参照できる。
コンパイラによる型チェックがある。
<const修飾>
例 :const int MAX = 100;
特徴:オブジェクトに有効範囲がある。
コンパイラによる型チェックがある。
メモリを消費する。
アドレスが与えられる。
実行時に評価される。
コンパイル時に整数定数が必要とされる場合は
使用できない。
(構造体のビットフィールドメンバのサイズ、
配列サイズ、列挙定数値、caseで使用される定数の値)
実行時のオーバーヘッドがある。
(ローカル変数とした場合、関数コールの度に
メモリ割当と初期化が行われる)
デバッグ時に参照可能。
関数マクロを作成する際は、なるべく
安全なマクロを書く方がよいでしょう。
具体的には、コードへの展開時に
引数を1回だけ評価するようにつくります。
引数を複数回評価したり、
あるいは全く評価しないマクロを
つくることは、なるべく避けます。
副作用の問題がつきまとうからです。
安全ではないマクロを作成した場合は、
ドキュメント等に記して、
使用者に注意を促す等の工夫をするとよいでしょう。
ブログ内検索
最新記事
(03/31)
(03/31)
(03/30)
(03/30)
(03/30)
最古記事
(03/23)
(03/24)
(03/25)
(03/26)
(03/27)