マクロ展開の注意点を試す。

はじめに

 本記事は、マクロについての注意点を実際に試したことをまとめたものである。

概要

 下記のページに書かれているマクロについての違反コードと適合コードを試してみた。
PRE05-C

違反コード

 マクロで展開された結果が"4"(数字の4の文字列)の想定が、そうならないソースである。
確認コマンド:gcc -E illegal.c

illegal.c
andre@andre-VirtualBox:~/work/PRE/PRE05-C$ cat illegal.c 
#define str(s) #s
#define foo 4

    str(foo);

確認コマンドでマクロが展開された後のソースを下記に示す。

確認コマンド実行結果
andre@andre-VirtualBox:~/work/PRE/PRE05-C$ gcc -E illegal.c
# 1 "illegal.c"
# 1 "<組み込み>"
# 1 "<コマンドライン>"
# 1 "illegal.c"



    "foo";

適合コード

 こちらは、想定どおり"4"(数値の4の文字列)に展開される。
確認コマンド:gcc -E legal.c

legal.c
andre@andre-VirtualBox:~/work/PRE/PRE05-C$ cat legal.c
#define xstr(s) str(s)
#define str(s) #s
#define foo 4

    xstr(foo);

 確認コマンド実行後のマクロ展開されたものを下記に示す。

andre@andre-VirtualBox:~/work/PRE/PRE05-C$ gcc -E legal.c
# 1 "legal.c"
# 1 "<組み込み>"
# 1 "<コマンドライン>"
# 1 "legal.c"




    "4";

気をつけなければいけないこと

 ここで注意しなければならないのは、# 演算子による引数の文字列化である。

#define str(s) #s    // str(foo) => "foo" => "foo"  ★ 文字列は、マクロで展開されない。
#define foo 4        
#define xstr(s) str(s)   // xstr(foo) => str(foo) => str(4) ★ マクロを2段階にすることで、【foo】 が 【4】 に展開された
#define str(s) #s        // str(4) => "4"
#define foo 4