使用“__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()
宏扩展到这样的定义。
在 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()
宏扩展到这样的定义。