C言語のマクロについてです。C言語のマクロには落とし穴が多いので、マクロをマスターして引っかからないようにしましょう。そしてC言語の達人になってください。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
C言語には、あらかじめ定義されたマクロがあります。
それは以下の7つです。
・__DATE__
__DATE__は、ソースがコンパイルされた日付です。
Mmm dd yyyyの形式を持つ文字列です。
月の名前はasctime関数でつくられるものと同じです。
・__FILE__
__FILE__は、ソースファイル名を表す文字列です。
・__LINE__
__LINE__は、行番号を表す整数定数です。
__LINE__が埋められたソースコードの
行番号を表します。
文字列ではないことに注意してください。
・__STDC__
__STDC__は、C言語の規格に合致している
処理系であるということを
示す整数定数で、値は1です。
・__STDC_HOSTED__
__STDC_HOSTED__は、処理系が規格に
合致しているホスト処理系であることを
示す整数定数で、値は1です。
規格に合致していなければ、値は0です。
・__STDC_VERSION__
__STDC_VERSION__は、規格のバージョンを表す
整数定数です。値は199901Lです。
・__TIME__
__TIME__は、コンパイルされた時刻を表します。
形式がhh:mm:ssの文字列です。
asctime関数で生成される時刻の形式と同じです。
これらのマクロ名は、
#defineや#undefの対象にしてはいけません。
PR
下記のような、異なる型の2つの変数の値を
入れ替える関数マクロをつくったとします。
#define SWAP(type, a, b) { type tmp = a; a = b; b = tmp; }
全体を波括弧で囲み、
変数の宣言を可能にしています。
ところが、このマクロを次のように使用すると
コンパイルエラーとなります。
if (x == 0) SWAP(int, x, y);
else {
/* 何らかの処理 */
}
このように展開されてしまうからです。
if (x == 0) { int tmp = x; x = y; y = tmp; };
else {
/* 何らかの処理 */
}
このような問題を回避するためには、
マクロをdo-while文で囲むとよいでしょう。
#define SWAP(type, a, b) \
do { type tmp = a; a = b; b = tmp; } while (0)
C言語の型をオブジェクト形式マクロで定義することは
避けた方がよいでしょう。
マクロではポインタ型を正確に表現できないからです。
#define STR char *
STR s1, s2;
このようにコーディングした場合、
char * s1, s2;
と展開されます。s1はポインタ型ですが、
s2はchar型になってしまいます。
型の定義はtypedefを使用した方がよいでしょう。
typedef char *STR;
STR s1, s2;
このようにすれば、s1, s2ともに
char *型で宣言できます。
ブログ内検索
最新記事
(03/31)
(03/31)
(03/30)
(03/30)
(03/30)
最古記事
(03/23)
(03/24)
(03/25)
(03/26)
(03/27)