#defineにはいろいろな構文が書けます
#define APPEND(A,B) (A##B)
こんなdefineは以下のように展開されます。
APPEND(str, cmp) → strcmp
単純に2つの単語を1つの単語に直してしまうdefineなんですね。
#define STR(A) (#A)
STR(string) → "string"
この書き方は文字列に直してくれる構文です。
#define DEBUG(A) std::cout << (#A) ":" << (A) << std::endl
こんなのを定義しておくと、変数名とその中身を出力してくれてとても便利。
なお、上でちょっと使ってますが、文字列と文字列はくっつきます。
"ABC" "DEF" → "ABCDEF"
これを知っておくと、長い文字列を埋め込もうとして、一行がとても長くなる時、
適当なところで一旦区切って改行を入れることが出来ます。
当然、define内でも使えますので、以下のような書き方も出来ます。
#define STRAPPEND(A,B) (#A #B)
STRAPPEND(str, cmp) → "strcmp"
おまけ
Visual C++にはこんな構文もあるみたい。
#define CHR(A) (#@A)
CHR($) → '$'
使いどころが解りませんが、どうしてもVC以外で使いたいならこれでどうでしょう。
#define CHR(A) (#A[0])
[追記]
#Aは標準という指摘があったので直しました。