在标题文件中使用__DATE__
或__TIME__
时,该标头包含的预处理器的结果可能会有所不同。
在标题文件中使用__DATE__
或__TIME__
在哪些情况下违反了一个定义规则?
作为后续行动:assert
标头是否违反了一个定义规则?
如果__TIME__
给出了不同的翻译单元的不同结果,则不得在翻译单元中需要相同结果的上下文中使用它。这意味着例如将对象(例如类成员)初始化为__TIME__
,其中该初始评估是包含在多个翻译单元中的标头的一部分,这将是有问题的。
__DATE__
如果您启动新的构建,但增量构建,只会重新编译更改的文件,则不太可能为不同的翻译单元提供不同的结果。
assert
是一个宏,根据何时包括NDEBUG
的定义方式,其扩展不同,因此整个项目都必须同意是否应定义NDEBUG
,或者在标头中定义的功能应避免使用assert
。
一个定义规则仅适用于变量,函数,类型,枚举或模板(例如3.2节,ISO/IEC 14882,1998 C 标准)。__DATE__
或__TIME__
都是扩展到字符串文字的预定义宏 - 这不是一个定义规则适用于。
assert()
也是预处理器宏。如果其扩展定义了变量,函数,类型,枚举或模板,则如果该定义在翻译单元之间有所不同,则其使用可能违反一定的定义规则。务实地,很难设想实现将具有扩展到这种定义的 assert()
宏的情况。