Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

[C++]文字と文字をがっちんこ

#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は標準という指摘があったので直しました。

投稿日時 : 2008年6月2日 20:12

Feedback

# re: [C++]文字と文字をがっちんこ 2008/06/02 20:59 774RR

argument substitution はきっちり規格書にありますな
# と ## は標準だす
ISO/IEC 14882:1998 16.3.1 - 16.3.3
#@ は標準にはないので独自っすね
ていうか VS2005 の MSDN にきっちり載ってるぢゃん
#@ には Microsoft Specific と明記されてる

# re: [C++]文字と文字をがっちんこ 2008/06/02 21:23 出水

やっぱり標準でしたか

前の職場で使っていたコンパイラがなぜかエラー出てたんで
標準だと思ってたのにダメなのかなーって勘違いしてました
修正しておきました

# [C++]おおっと!includeの強引な割り込み!! 2008/06/03 17:48 Garbage Collection

[C++]おおっと!includeの強引な割り込み!!

タイトル
名前
Url
コメント