使用“__DATE__”或“__TIME__”是否违反了one-definition-rule?

Does using `__DATE__` or `__TIME__` violate the one-definition-rule?

在 header 文件中使用 __DATE____TIME__ 时,header 包含的预处理器结果可能会有所不同。

在什么情况下在 header 文件中使用 __DATE____TIME__ 会违反 one-definition-rule?

作为 follow-up:assert header 是否违反了 one-definition-rule?

如果 __TIME__ 为不同的翻译单元给出不同的结果,那么它不能用于跨翻译单元需要相同结果的上下文中。这意味着例如将 object(例如 class 成员)初始化为 __TIME__,其中初始化程序是包含在多个翻译单元中的 header 的一部分,这将是有问题的。

如果您开始全新构建,

__DATE__ 不太可能为不同的翻译单元提供不同的结果,但是增量构建(仅重新编译已更改的文件)确实可能成为问题,因为嗯。

assert 是一个宏,它根据包含 header 时 NDEBUG 的定义方式进行不同的扩展,因此整个项目必须就是否 NDEBUG 达成一致应该被定义,或者在 headers 中定义的函数应该避免使用 assert.

单一定义规则仅适用于变量、函数、class 类型、枚举或模板(例如第 3.2 节,ISO/IEC 14882、1998 C++ 标准)。 __DATE____TIME__ 都是扩展为字符串文字的预定义宏 - 这不是单一定义规则适用的事物之一。

assert() 也是一个预处理器宏。如果它的扩展定义了一个变量、函数、class 类型、枚举或模板,那么它的使用可能会违反单一定义规则,如果翻译单元之间的定义不同的话。从实用的角度来说,很难想象这样一种情况,在这种情况下,实现会有一个 assert() 宏扩展到这样的定义。