C++ 为什么';像“日期”宏那样叮当作响?

C++ 为什么';像“日期”宏那样叮当作响?,c++,clang,qt-creator,C++,Clang,Qt Creator,我使用\uuuu DATE\uuuu宏获取编译时年份: const QString build_year = __DATE__ + 7; QtCreator中的叮当声代码模型会抛出一个-Wdate time警告,提示您使用\uuuuuuuuuu宏 警告:日期或时间宏的扩展不可复制 我可以使用-Wno date time禁用此警告,但是使用\uuu date\uuu有什么问题 什么是宏的“扩展”,它如何“可复制”或“不可复制”,以及为什么“不可复制”不好?从许多角度来看,重复构建复制二进制相同输

我使用
\uuuu DATE\uuuu
宏获取编译时年份:

const QString build_year = __DATE__ + 7;
QtCreator中的叮当声代码模型会抛出一个-Wdate time警告,提示您使用\uuuuuuuuuu

警告:日期或时间宏的扩展不可复制

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


什么是宏的“扩展”,它如何“可复制”或“不可复制”,以及为什么“不可复制”不好?

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


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

警告消息告诉您原因。使用宏不会产生可复制的构建,因为其值会随时间变化。2018年的版本和2019年的版本不会产生相同的二进制文件。

版本会根据您构建它的时间而有所不同(因为日期不同)。我不相信默认情况下,
clang++
会启用
-Wdate time
(我只是在我的系统上尝试过,除非明确启用它,否则不会收到警告)。QtCreator是否为您启用了它?或者制作一个Makefile或等效文件?除非有人要求,否则你不应该得到这个警告。@KeithThompson在QTCreator中默认的叮当声方案是“叮当声只检查几乎所有东西”-
-Weverything-Wno-c++98 compat-Wno-c++98 compat-pedantic-Wno unused macros-Wno newline eof-Wno exit time destructors-Wno global constructors-Wno gnu零变量宏参数-Wno文档-Wno shadow-Wno开关枚举-Wno缺失原型-Wno已使用但标记未使用的
@yalov:启用
-Wdate time
。实际上,Clang对这两种方法都没有意见。如果您将
-Wdate time
传递给编译器,则您不喜欢
\uuuuu DATE\uuuuuu
。有关此主题的更多信息,请访问