Mesoscopic Programming

タコさんプログラミング専門

マクロ定義されたトークンを文字列に変換するマクロ

Visual C++ 2010 Express 使ってるんですけど、
関数名とかは __FUNCTION__ とかで最初から文字列として定義されてるのに、
プロジェクト名とかは定義されてないんですよね。

ソリューション名とかプロジェクト名をソースコード中で使いたいとき、どうすれば良いんですか?ってんで、
とりあえずプロジェクトのコンパイルオプションプロパティで、Project=$(ProjectName)ってしたんですよ。

これを
#define STRING( token ) #token
的なやり方で文字列化すれば良いんじゃね?とか思ったんですよ。

でもこのやり方だと、STRING( Project )ってやると
"Project"っていう文字列が返ってきちゃうわけなんですよ。

こういう場合は、実はもう1回展開してやる必要があるみたいなんですね。なので
#define MACRO_STRING( macro ) STRING( macro )って定義して
MACRO_STRING( Project )ってやると、やっとプロジェクト名が文字列として取り出せるわけなんですよ。

これに気付くまでアホみたいに何時間もかかっちゃいました。