2016-04-27 2 views
7

Просто из любопытства. Мне интересно, может ли значение, заданное стандартным макросом препроцессора __TIME__, изменить в пределах одной единицы перевода?Является ли макрос препроцессора __TIME__ гарантированно постоянным в файле?

Другими словами, __TIME__ определяется один раз во время предварительной обработки, а затем фиксируется или пересматривается каждый раз, когда он встречается?

Если это не указано стандартом C, существует ли стандартное поведение де-факто среди основных реализаций (gnu, clang, intel, msvc)?

+1

См. 6.10.8.1p1 Скорее всего, это означает, что при предварительной обработке _starts_. Все остальное было бы бесполезно. – Olaf

+1

Я думаю, что текущая версия GNU CPP устанавливает значения для '__TIME__' и '__DATE__' в то же время, в то время, когда макрос сначала расширяется. Я не уверен на 100%, но объем определенного набора значений для этих макросов представляется выделенным, в то время как параметры командной строки анализируются, поэтому по существу один раз за вызов. Источник GCC, как известно, запутан. – NovaDenizen

+0

@NovaDenizen необходимость одновременности '__DATE__' и' __TIME__' - отличная точка! Представьте, если бы эти 2 не были установлены в одно и то же мгновение. Else с '__TIME__'' 00: 00: 00' '__DATE__' может быть вчера или сегодня. Единственная нормальная функциональность - это одноразовая настройка обоих значений. – chux

ответ

5

В C строго не указано, что «время перевода» является постоянным во время предварительной обработки/компиляции.

Мой опыт был постоянным. Но поскольку это только второе, для данной компиляции необходимо пересечь вторую границу, чтобы отличаться.

__TIME__ время перевода блока предварительной обработки перевода: символьная строка буквальной формы "hh:mm:ss", как в то время, генерируемом с помощью функции asctime. Если время перевода не доступно, должно быть предоставлено допустимое время реализации. C11 §6.10.8.1 1

Определения __DATE__ и __TIME__, когда соответственно, дата и время перевода не доступны (6.10.8.1). (Информативный) C11 §J.3.11 1

+0

Я сомневаюсь, что есть стандарт де-факто, но это только мнение. Однако я согласен с [@Olaf] (http://stackoverflow.com/questions/36901990/is-time-preprocessor-macro-guaranteed-to-be-constant-within-a-file/36902152#comment61368099_36901990), что один возникновение является разумным. Теперь вопрос в том, что такое прецедент, когда он имеет значение? – chux

+0

Не используйте случай, о котором я могу думать ... просто любопытство. – marack