5

コンパイル コマンドでバージョン文字列を渡したい:

$ 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)

マクロにコンマが含まれているため、これは機能しません。つまり、VERSION2 つの引数を に渡しているように見えます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: プリプロセッサ マクロをまったく使用せずにこれを行う方法を誰かが見つけた場合、私は非常に嬉しく思います。

4

2 に答える 2

8

TOSTR_可変引数を取るマクロを書くことができます:

#define TOSTR_(x...) #x
#define STRINGIFY(x) TOSTR_(x)
#define VERSION_STR STRINGIFY(VERSION)

このコードは Apple LLVM バージョン 5.0 でテストされ、動作します。

于 2013-12-04T20:07:37.477 に答える