为什么 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 年的构建不会生成相同的二进制文件。
我使用 __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 年的构建不会生成相同的二进制文件。