使用`__DATE__`或`__TIME__`是否违反了单定义规则?

时间:2016-12-21 08:18:01

标签: c++ datetime c-preprocessor one-definition-rule

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

在哪种情况下,在头文件中使用__DATE____TIME__违反了单定义规则?

作为后续跟踪:assert标头是否违反了单一定义规则?

2 个答案:

答案 0 :(得分:4)

如果__TIME__为不同的翻译单元提供不同的结果,则不得在翻译单元需要相同结果的上下文中使用它。这意味着例如将对象(例如,类成员)初始化为__TIME__,其中该初始化程序是包含在多个翻译单元中的标题的一部分,将会出现问题。

如果你开始一个全新的构建,

__DATE__不太可能为不同的翻译单元提供不同的结果,但是只有重新编译已经改变的文件的增量构建才会使它成为一个问题。

assert是一个宏,它的扩展方式会有所不同,具体取决于NDEBUG在包含标题时的定义方式,因此整个项目必须就是否应定义NDEBUG或函数达成一致标题中定义的内容应避免使用assert

答案 1 :(得分:0)

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

assert()也是预处理器宏。如果其扩展定义了变量,函数,类类型,枚举或模板,那么如果转换单元之间的定义不同,则其使用可能会违反单定义规则。实际上,很难设想一种实现将assert()宏扩展到这样一个定义的情况。