【发布时间】:2012-06-22 07:38:47
【问题描述】:
我想知道在启用任何类型的 gcc/g++ 优化的情况下,以下代码在编译时是否会引发错误或警告。
int a;
a = func();
if (a == 2) {
assert(false);
}
我认为以下代码可以在发布配置中引发警告“设置但未使用的变量”。
int a;
a = func();
assert(a != 2);
但是上面的代码呢? (gcc 可以删除 if 语句本身,因为在 if 语句或 if 块中(在发布版本中)不会做任何事情,然后抛出警告“未使用但设置变量")
编辑:这绝对不是关于减少代码或 exe 大小的问题。我想知道一段在任何构建配置中都能成功的代码。
编辑:我们在发布模式下禁用断言
【问题讨论】:
-
据我所见,gcc 不会发出警告,说明优化器运行后代码会发生什么。而且我认为实际上这样做是错误的。警告的目的不是警告您优化器使您在代码中所做的事情变得多余。
-
@LuchianGrigore 是的,我已经尝试使用 -0s -O3 等。编译成功。但我不确定是否存在一些能够使构建失败的随机配置。
-
@Omnifarious gcc 由于更积极的优化,肯定会发出额外的警告。请参阅here 了解更多信息。
-
@juanchopanza,那本书已经过时了,
-Wuninitialized现在在-O0上启用(但效果不是很好,所以仍然不会对该代码发出警告,所以你的观点持有) -
@juanchopanza - 点头 我的观点比这更微妙一些。是的,优化器会给你更好的质量警告。但这些警告与优化器完成对您的代码的操作后代码的外观无关。它们是关于它在进行更深入的分析后在您最初拥有的代码中发现的东西。