【问题标题】:Initialize C++ const variable with itself用自身初始化 C++ const 变量
【发布时间】: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&gt;i; j--) 唯一不会被优化的是:if ( i == i ) std::cout &lt;&lt; "At least it's equal.\n"; 考虑到 M.M. 的评论,这一切都说得通。这应该是一个答案。 ThomasG 目前的回答并没有像 Voigt 那样质疑我关于我是 0 的说法。

标签: c++ initialization constants


【解决方案1】:

它的名字是“未定义的行为”,将i 设置为 0 只是一种可能的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多