4

リビジョン文字列を出力する必要がある C++ プロジェクトがあります。リビジョン文字列は会社ごとに指定されており、プロトコルにはビルド時間が yyyy/mm/dd として含まれています。

私はこれをビルド システムからマクロとして指定していましたが、プリコンパイル済みヘッダーが台無しになるため (日が変わるとインクリメンタル ビルドで)、これはもはやオプションではありません。

コンパイラからビルド日を取得してこれを実装しようとしていますが__DATE____TIMESTAMP__月を Mmm で指定します。

月を数字として取る方法はありますか?


以下の回答に基づいて、私が終了したバージョンは次のとおりです。

#define __MONTH__ (\
  __DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? "01" : "06") \
: __DATE__ [2] == 'b' ? "02" \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? "03" : "04") \
: __DATE__ [2] == 'y' ? "05" \
: __DATE__ [2] == 'l' ? "07" \
: __DATE__ [2] == 'g' ? "08" \
: __DATE__ [2] == 'p' ? "09" \
: __DATE__ [2] == 't' ? "10" \
: __DATE__ [2] == 'v' ? "11" \
: "12")

...

std::string udate = __DATE__;
std::string date = udate.substr(7, 4) + "/" + __MONTH__ + "/" + udate.substr(4, 2);
boost::replace_all(date, " ", "0");

ありがとう

4

2 に答える 2

7

以下のマクロはあなたの要件に合っていると思います。ここでは、月の 3 番目の文字に取り組んでいます。これは、ほとんどの月 (1 月/6 月、3 月/4 月を除く) で一意であるため、比較が容易です。

#define MONTH (\
  __DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 1 : 6) \
: __DATE__ [2] == 'b' ? 2 \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 3 : 4) \
: __DATE__ [2] == 'y' ? 5 \
: __DATE__ [2] == 'l' ? 7 \
: __DATE__ [2] == 'g' ? 8 \
: __DATE__ [2] == 'p' ? 9 \
: __DATE__ [2] == 't' ? 10 \
: __DATE__ [2] == 'v' ? 11 \
: 12)
于 2013-11-04T01:29:43.463 に答える
2

似ていますが、正しい解決JunJan

#define __MONTH__ (\
    __DATE__[2] == 'n' ? (__DATE__[1] == 'a' ? "01" : "06") \
    : __DATE__[2] == 'b' ? "02" \
    : __DATE__[2] == 'r' ? (__DATE__[0] == 'M' ? "03" : "04") \
    : __DATE__[2] == 'y' ? "05" \
    : __DATE__[2] == 'l' ? "07" \
    : __DATE__[2] == 'g' ? "08" \
    : __DATE__[2] == 'p' ? "09" \
    : __DATE__[2] == 't' ? "10" \
    : __DATE__[2] == 'v' ? "11" \
    : "12")

私のソリューションにバグが見つかった場合は、私を改善してください。

于 2014-06-03T11:09:12.233 に答える