【发布时间】:2015-11-14 02:00:29
【问题描述】:
刚才我遇到了以下类型的错误:
#include <iostream>
const int i = i;
int main(void)
{
/* not allowed by default, but with -fpermissive */
//const int i;
/* allowed by default, even without -fpermissive. Seems to initialize to 0 */
for ( int j = 0; j < i; ++j )
std::cout << "hi";
/* i = 0 */
}
编译:
g++ const-init.cpp -Wall -Wextra -pedantic -O2
因为编译器默默地将 i 初始化为 0,所以一些循环被优化掉了。由于复制粘贴错误而发生错误。
此“功能”是否有效和/或在某处记录?它有什么用?有名字吗?
编辑:没有 -O2 g++ 的行为就像我希望它的行为:它发出以下错误
const-init.cpp:8:19: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
const int i = i;
^
那么为什么编译器在使用-O2标志时会假设i为0,甚至因为这个假设而删除了整个循环呢?
【问题讨论】:
-
this Q&A 中的信息可能比您需要的多得多,但是 TL;DR:不要依赖
i的值。变量i在它自己的初始化范围内,但它的值没有明确定义。 -
你们很快,在发布这个问题后,我注意到 -Wall 确实发出警告,但在使用 -O2 时并非如此。我在问题中指定了这个
-
当代码导致未定义的行为时,编译器可能会假设任何事情
-
@Voigt:我很伤心 0,因为我没有测试其他条件的想法,但你是对的,循环同样优化了例如
for ( int j=2; j>i; j--)唯一不会被优化的是:if ( i == i ) std::cout << "At least it's equal.\n";考虑到 M.M. 的评论,这一切都说得通。这应该是一个答案。 ThomasG 目前的回答并没有像 Voigt 那样质疑我关于我是 0 的说法。
标签: c++ initialization constants