ソースファイルがあります。コードをコンパイルするときに、いつビルドされたかを実行可能ファイルに記憶させたいと考えています。それが可能かどうか疑問に思っています。例えば:
int main(){
time_t t = ??? // Time when this line is compiled
//print out value of t in certain format.
return t
}
ソースファイルがあります。コードをコンパイルするときに、いつビルドされたかを実行可能ファイルに記憶させたいと考えています。それが可能かどうか疑問に思っています。例えば:
int main(){
time_t t = ??? // Time when this line is compiled
//print out value of t in certain format.
return t
}
__TIME__
および__DATE__
マクロを使用して、プリプロセッサが実行された時刻を取得できます。文字列なので、そこからに変換するtime_t
必要があります。
私がまとめた簡単な例:
#include <time.h>
#include <iostream>
#include <cassert>
time_t build_time() {
static const char *built = __DATE__" "__TIME__;
struct tm t;
const char *ret = strptime(built, "%b %d %Y %H:%M:%S", &t);
assert(ret);
return mktime(&t);
}
int main() {
std::cout << build_time() << std::endl;
}
これがさまざまなロケールとどのように相互作用するかについて少し心配したので、最近のC標準をざっと見て、次の文章を見つけました。
__DATE__
前処理変換単位の変換日:「Mmmdd yyyy」形式の文字列リテラル。月の名前はasctime
関数によって生成されたものと同じであり、ddの最初の文字はスペース文字です。値は10未満です。翻訳の日付が利用できない場合は、実装で定義された有効な日付を指定する必要があります。
asctime
それは非常に明確です:
...月の略語は、「1月」、「2月」、「3月」、「4月」、「5月」、「6月」、「7月」、「8月」、「9月」、「10月」、「 11月」、「12月」..。
しかし%b
、strptime()
言うの:
%bまたは%Bまたは%h
現在のロケールに応じた月の名前(省略形またはフルネーム)。
したがって、これは実行時にロケールが何に設定されるかについての仮定をしていることに注意する必要があります。
constexpr
(理論的には、C ++ 11でコンパイル時にそれを行う関数を1つか2つ書くことができますが、控えめに言ってもそれは簡単ではありません!)
事前定義されたマクロ__DATE__
を__TIME__
使用して、時間を文字列として記録できます。
が必要な場合はtime_t
、実行時に変換する必要があります。
問題に完全に対処しているわけではありませんが、VisualStudioではビルド後のイベントを追加できます。新しいファイルの作成や既存のファイルの更新などのコンソールコマンドを追加して、最後に正常にビルドされた日時を確認します。レポートファイルを必要なディレクトリにコピーするためにこれを行っています。プロジェクトをビルドするだけで、すべてそこに移動します:)
コード内の実行可能ファイルのプロパティが最後に変更された日時を読み取ります。