为什么 Clang 不喜欢 __DATE__ 宏?

Why doesn't Clang like the __DATE__ macro?

我使用 __DATE__ 宏来获取编译时年份:

const QString build_year = __DATE__ + 7;

QtCreator 中的 Clang 代码模型针对使用 __DATE__ 宏抛出 -Wdate-time 警告。

warning: expansion of date or time macro is not reproducible

我可以使用 -Wno-date-time 禁用此警告,但是使用 __DATE__ 有什么问题?

什么是宏的"expansion",怎么会是"reproducible"或"not reproducible",为什么"not reproducible"不好?

从许多角度来看,重复构建再现二进制相同的输出是可取的。从相同的工具链构建相同的源代码,每次提供不同的二进制文件可能会隐藏严重的问题。

如果您不需要每次构建相同的代码时都生成相同的二进制文件,只需禁用该警告即可。这就是存在命令行开关的原因。

警告消息告诉您原因。使用宏不会导致可重现的构建,因为它的值会随时间变化。 2018 年的构建和 2019 年的构建不会生成相同的二进制文件。