Использование `__DATE__` или`__TIME__` нарушает правило одного определения?
Когда используешь __DATE__
или же __TIME__
в заголовочном файле результаты препроцессора для включения этого заголовка могут несколько отличаться.
При каких обстоятельствах использование __DATE__
или же __TIME__
в заголовочном файле нарушать правило одного определения?
Как продолжение: ли assert
заголовок нарушает правило одного определения?
2 ответа
Если __TIME__
дает разные результаты для разных единиц перевода, тогда он не должен использоваться в контексте, где требуется одинаковый результат для разных единиц перевода. Это означает, например, инициализацию объекта (например, члена класса) __TIME__
где этот инициализатор является частью заголовка, который включается в несколько блоков перевода, будет проблематично.
__DATE__
с меньшей вероятностью даст разные результаты для разных модулей перевода, если вы начнете новую сборку, но инкрементные сборки, которые перекомпилируют только измененные файлы, также могут стать проблемой.
assert
это макрос, который расширяется по-разному в зависимости от того, как NDEBUG
был определен, когда его заголовок был включен, поэтому либо весь проект должен согласовать NDEBUG
должны быть определены, или функции, определенные в заголовках, должны избегать использования assert
,
Одно правило определения применимо только к переменным, функциям, типам классов, перечислениям или шаблонам (например, раздел 3.2, ISO/IEC 14882, стандарт C++ 1998 года). __DATE__
или же __TIME__
оба предопределенных макроса, которые расширяются до строкового литерала - что не является одной из вещей, к которой применимо правило одного определения.
assert()
также макрос препроцессора. Если его расширение определяет переменную, функцию, тип класса, перечисление или шаблон, то его использование может потенциально нарушать правило одного определения, если это определение отличается между единицами перевода. С практической точки зрения трудно представить себе ситуацию, в которой реализация assert()
макрос, расширенный до такого определения.