2016-04-27 7 views
7

ちょうど好奇心から私は標準__TIME__プリプロセッサマクロによって与えられた値が単一の翻訳単位内で変更できるかどうか疑問に思っていますか?__TIME__プリプロセッサマクロはファイル内では定数であることが保証されていますか?

つまり、前処理中に一度確定された__TIME__は、遭遇するたびに再評価されますか?

これがC標準で指定されていない場合、主要な実装(gnu、clang、intel、msvc)の間に事実上の標準的な動作がありますか?

+1

6.10.8.1p1を参照してください。これは、前処理が開始されるときを意味している可能性が非常に高いです。他のものはかなり役に立たないでしょう。 – Olaf

+1

GNU CPPの現在のバージョンは、マクロが最初に展開されたときに、 '_TIME__'と' __DATE__'の値を同時に設定すると思います。私は100%確信していませんが、これらのマクロの特定の値セットの範囲は、コマンドラインオプションが解析されている間に割り当てられているように見えます。 GCCソースは悪名高く畳み込まれています。 – NovaDenizen

+0

@NovaDenizen '__DATE__'と' __TIME__'の同時性の必要性は優れています!これらの2つが同じ瞬間に設定されていないと想像してください。それ以外の '__TIME__'の' 00:00:00'は '__DATE__'が昨日または今日になる可能性があります。唯一正常な機能は、両方の値の1回限りの設定です。 – chux

答えて

5

Cは "翻訳の時間"を厳密に指定していませんが、前処理/編集を通して一定です。

私の経験は一定です。しかし、それは第二のものにすぎないので、所与の編集は第二の境界を越えて相違する必要がある。

__TIME__前処理翻訳単位の翻訳の時間: asctime関数によって生成された時のような形"hh:mm:ss"のリテラル文字列。変換の時間が利用できない場合は、 実装定義の有効時間を提供するものとする。 C11§6.10.8.11

それぞれ__DATE____TIME__の定義、翻訳の日付と 時間は(6.10.8.1)は使用できません。 (参考)C11§J.3.111

+0

デファクトスタンダードがあるとは思えますが、それはただの意見です。しかし、私は[@Olaf](http://stackoverflow.com/questions/36901990/is-time-preprocessor-macro-guaranteed-to-be-constant-within-a-file/36902152#comment61368099_36901990)に同意する発生は合理的です。さて問題は、それが違いを生むユースケースです。 – chux

+0

私が考えることができるユースケースはありません...ただの好奇心。 – marack

関連する問題