Использование `__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() макрос, расширенный до такого определения.

Другие вопросы по тегам