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

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

関数マクロでは、#演算子というものが使えます。
#演算子はマクロの引数を文字列に変換するものです。

関数マクロの置換字句列の中で使用されている
引数の前に#がついていると
対応する実引数を文字列として
引数と置き換えます。

例えば、

#define DEBUG_PRINT(a) (printf("%s:%d\n", #a, a))

という関数マクロがあり、

x = 100;
DEBUG_PRINT(x);

という風に使用された場合、次のように展開されます。

printf("%s:%d\n", "x", x);

結果として、標準出力に、

x:100

が出力されます。
PR
#演算子を使用する時、#の次の字句は必ず
引数でなければなりません。

また、変換に際しては、
次のルールがあります。

・実引数の先頭と最後の空白類は取り除かれる。
・実引数の中の空白類は1つの空白文字にまとめられる。
・実引数が文字定数または文字列リテラルの場合、
 ダブルクォーテーション(")およびバックスラッシュ(\)の
 前にバックスラッシュを挿入する。
 (区切りのためのダブルクォーテーションも含めて)
・国際文字名の最初のバックスラッシュの前に
 バックスラッシュを挿入する。
 (この処理を行うか否かは処理系定義)
・実引数が空ならば""(空の文字列)となる。

変換の結果が正しい単純文字列リテラルでない場合、
その動作は未定義となります。
##演算子はマクロ内の文字を
連結するために使用されます。

#define TEST 1 ## 0

このマクロは使用時に、
1と0が連結され、##がなくなり、
10に展開されます。

通常は引数の直前または直後に、
##を配置して使用します。

その場合、対応する実引数を文字列にして、
それから、##の直前にある字句と直後の字句を連結します。

#define TEST_PRINT(a) (printf("%d, %d\n", a ## 1, a ## 2))

int x1 = 10;
int x2 = 20;

TEST_PRINT(x);

上記は、

(printf("%d, %d\n", x1, x2));

に展開され、実行すると

10, 20

と表示されます。

##演算子による連結後、
その結果が不正な場合の動作は未定義です。

##演算子は置き換えられる字句の
先頭または終わりにあってはいけません。

また、#演算子および##演算子の
評価順序は未規定です。
HOMENext ≫
ブログ内検索
バーコード
アーカイブ

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