2016-04-27 45 views
7

出於好奇,我想知道標準__TIME__預處理器宏給出的值是否可以在單個翻譯單元內更改?是否__TIME__預處理器宏保證在文件內保持不變?

換句話說,__TIME__在預處理過程中被確定一次,然後被修復,或者每次遇到時都會重新評估它嗎?

如果這不是C標準規定的,主要實現(gnu,clang,intel,msvc)之間是否存在事實上的標準行爲?

+1

請參閱6.10.8.1p1它很可能意味着預處理_starts_。其他任何東西都是無用的。 – Olaf

+1

我認爲GNU CPP的當前版本同時爲'_TIME__'和'__DATE__'建立了值,當時任何一個宏都是第一次擴展。我不是100%確定的,但是這些宏的一組特定值的範圍似乎是在命令行選項被解析時分配的,所以基本上每次調用一次。海灣合作委員會的來源是臭名昭着的複雜。 – NovaDenizen

+0

@NovaDenizen需要'__DATE__'和'__TIME__'的同時性是一個很棒的點!想象一下,如果這兩個不是在同一時刻。否則'__TIME__'爲'00:00:00','__DATE__'可能是昨天或今天。唯一合理的功能是兩個值的一次性設置。 – chux

回答

5

在整個預處理/編譯過程中,C沒有嚴格指定「翻譯時間」是恆定的。

我的經驗一直是恆定的。但是由於它只是第二個,所以給定的彙編需要跨越第二個邊界纔能有所不同。

__TIME__預處理翻譯單元翻譯的時間:字符串文字形式"hh:mm:ss"作爲在由 asctime功能生成的時間。如果翻譯時間不可用,應提供實現定義的有效時間。 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