コマンドラインのプリプロセッサー定義で文字列を渡す
$ 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 から指定したいんだけれど?」という同僚のリクエストにこたえるためにつくったサンプルコードでした)