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
と表示されます。
##演算子による連結後、
その結果が不正な場合の動作は未定義です。
##演算子は置き換えられる字句の
先頭または終わりにあってはいけません。
また、#演算子および##演算子の
評価順序は未規定です。
ブログ内検索
最新記事
(03/31)
(03/31)
(03/30)
(03/30)
(03/30)
最古記事
(03/23)
(03/24)
(03/25)
(03/26)
(03/27)