コンパイル コマンドでバージョン文字列を渡したい:
$ g++ -Wall -D VERSION="2013-12-03 02:15:21, commit cb060df" -o main main.cpp
私のコード内には、次のものがあります。
#define TOSTR_(x) #x
#define STRINGIFY(x) TOSTR_(x)
#define VERSION_STR STRINGIFY(VERSION)
マクロにコンマが含まれているため、これは機能しません。つまり、VERSION
2 つの引数を に渡しているように見えますTOSTR()
(明らかに、マクロは1 つの一意の引数としてVERSION
渡された後にのみ展開されます)。STRINGIFY()
ここで見つけた次のアプローチも機能しません。
#define CONCAT(...) __VA_ARGS__
#define TOSTR_(x) #x
#define STRINGIFY(x) TOSTR_(CONCAT(x))
#define VERSION_STR STRINGIFY(VERSION)
これは
#define VERSIONSTR "CONCAT(2013-12-03 02:15:21, commit cb060df)"
つまり、マクロCONCAT()
は展開されません。
注 1:バージョン文字列は実際には動的に生成され、引用符が含まれている可能性があるため、コマンド ラインでC文字列を渡したくありません。これはg++ -D VERSION=\""$(GENERATED_STRING)"\"
、渡された引数を文字列化する代わりに単に書くだけでは機能しないことを意味します。
注 2: プリプロセッサ マクロをまったく使用せずにこれを行う方法を誰かが見つけた場合、私は非常に嬉しく思います。