コマンドラインのプリプロセッサー定義で文字列を渡す

$ cc -o hello hello.c -DHELLO="\"hello, world!\""
$ ./hello
hello, world!

などと、コンパイルオプションで渡した文字列をソースコードで使うにはどうしたらいいか?

解答編:

#define quote(x) q(x)
#define q(x) #x

#include <stdio.h>

int main() {
  puts(quote(HELLO));
  return 0;
}

quote マクロで受け取ったプリプロセッサー定義 HELLO を hello, world! に展開し、つづく q マクロで # を使ってダブルクォートでくくり、文字列リテラルに変換している。

直接は文字列を渡せないので、ちょっとしたマクロの組み合わせでがんばってみた、の巻。

(「ソースコードに埋めるログ文字列の接頭辞を Makefile から指定したいんだけれど?」という同僚のリクエストにこたえるためにつくったサンプルコードでした)