忍者ブログ
C言語のマクロについてです。C言語のマクロには落とし穴が多いので、マクロをマスターして引っかからないようにしましょう。そしてC言語の達人になってください。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

#演算子を使った下記のようなコードがあったとします。

#define STR(s) #s
#define MAX_NUM 10

printf("%s\n", STR(MAX_NUM));

この場合、出力結果は、

MAX_NUM

となります。10とはなりません。

もし、MAX_NUMの内容である10と表示させたいならば、
マクロを二段階にする必要があります。

#define STR(s) #s
#define M_STR(s) STR(s)
#define MAX_NUM 10

printf("%s\n", MCR_STR(MAX_NUM));

こうすれば、M_STRの展開時に
MAX_NUMが10となりますから、
出力結果も10となります。
PR
一般的にマクロの最後にはセミコロンをつけません。

というもの、以下のようなコードの場合、
問題が起こるからです。

#define INCREMENT(x, max) ((x) = ((x) + 1) % (max));

v = INCREMENT(i, 5) + 100;

INCREMENT()は、xをカウントアップします。
そして、もしmaxに達したらxを0にします。

展開結果は次のようになります。

v = ((i) = ((i) + 1) % (5)); + 100;

マクロの最後にセミコロンがついているので、
文が2つに別れてしまいます。

しかも、コンパイルエラーとはなりません。
不具合の原因もつかみにくいです。
C言語で定数を定義する方法は、
オブジェクト形式マクロだけではありません。

const修飾する方法もありますし、
列挙定数を使う方法もあります。

それぞれ、特徴がありますので、
使い分けるとよいでしょう。

<記号定数>
例 :#define MAX 100
特徴:プリプロセス時に評価される。
   メモリを消費しない。
   アドレスが与えられない。
   デバッグ時に参照できない。
   コンパイラによる型チェックがない。

<列挙定数>
例 :enum { MAX = 100 };
特徴:intとして表現可能な値を持つ整数定数式を表現できる。
   コンパイル時に評価される。
   メモリを消費しない。
   アドレスが与えられない。
   デバッグ時に参照できる。
   コンパイラによる型チェックがある。

<const修飾>
例 :const int MAX = 100;
特徴:オブジェクトに有効範囲がある。
   コンパイラによる型チェックがある。
   メモリを消費する。
   アドレスが与えられる。
   実行時に評価される。
   コンパイル時に整数定数が必要とされる場合は
   使用できない。
   (構造体のビットフィールドメンバのサイズ、
   配列サイズ、列挙定数値、caseで使用される定数の値)
   実行時のオーバーヘッドがある。
   (ローカル変数とした場合、関数コールの度に
   メモリ割当と初期化が行われる)
   デバッグ時に参照可能。
ブログ内検索
バーコード
アーカイブ

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