2016-04-27 13 views
7

Solo per curiosità mi chiedo se il valore fornito dalla macro standard del preprocessore __TIME__ possa cambiare all'interno di una singola unità di traduzione?La macro del preprocessore __TIME__ è garantita come costante all'interno di un file?

In altre parole, è __TIME__ determinato una volta durante la pre-elaborazione e quindi risolto, o viene rivalutato ogni volta che viene rilevato?

Se questo non è specificato dallo standard C, esiste un comportamento standard di fatto tra le principali implementazioni (gnu, clang, intel, msvc)?

+1

Vedere 6.10.8.1p1 Molto probabilmente significa quando il pre-elaborazione _startanti_. Qualsiasi altra cosa sarebbe abbastanza inutile. – Olaf

+1

Penso che la versione corrente di GNU CPP stabilisca valori per '_TIME__' e' __DATE__' allo stesso tempo, al momento in cui la prima macro viene espansa. Non sono sicuro al 100%, ma l'ambito di un particolare insieme di valori per queste macro sembra essere assegnato mentre le opzioni della riga di comando sono analizzate, quindi essenzialmente una volta per invocazione. La fonte GCC è notoriamente contorta. – NovaDenizen

+0

@NovaDenizen un bisogno di simultaneità di '__DATE__' e' __TIME__' è un punto eccellente! Immagina se questi 2 non fossero impostati nello stesso istante. Altrimenti con un '__TIME__' di' 00: 00: 00' il '__DATE__' potrebbe essere ieri o oggi. L'unica sana funzionalità è un'impostazione unica di entrambi i valori. – chux

risposta

5

C non specifica rigorosamente il "tempo di traduzione" è costante durante una pre-elaborazione/compilazione.

La mia esperienza è stata costante. Ma poiché è solo al secondo, una determinata compilazione dovrebbe attraversare un secondo limite per differenziarsi.

__TIME__ Il tempo di traslazione del gruppo di traduzione preelaborazione: una stringa di caratteri letterale del modulo "hh:mm:ss" come nel tempo generato dalla funzione asctime. Se l'ora della traduzione non è disponibile, deve essere fornito un orario valido definito dall'implementazione . C11 §6.10.8.1 1

Le definizioni per __DATE__ e __TIME__ quando rispettivamente, la data e l'ora del traduzione non sono disponibili (6.10.8.1). (Informativo) C11 §J.3.11 1

+0

Dubito che ci sia uno standard di fatto, ma questa è solo un'opinione. Tuttavia sono d'accordo con [@Olaf] (http://stackoverflow.com/questions/36901990/is-time-preprocessor-macro-garantito-di-be-constant-within-a-file/36902152#comment61368099_36901990) che un singolo l'evento è ragionevole. Ora la domanda è: qual è il caso d'uso in cui fa la differenza? – chux

+0

Nessun caso d'uso a cui possa pensare ... solo una curiosità. – marack