为什么 C++ 中指定初始化器有效?

7

经过一段时间在网上的搜索,我得出结论:指定初始化器并不是任何C++标准的一部分。然而,在使用g++(4.7.0)编译此代码时,它仍然可以正常运行。

#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
    int test[2][2] ={
        [0]={1,2},
        [1]={3,4},
    };

    for (int x = 0; x<2;x++)
    {
        for (int y = 0; y<2; y++)
        {
            cout << test[x][y] << endl;
        }
    }

    return 0;
}

它将编译并正常运行。

我是否遗漏了什么?根据我所读的所有内容,C++不应该支持这种类型的代码。


2
你是正确的 - 在C++中不允许这样做。无论好坏,g++在编译C++时包含了许多C99/C11特性作为扩展。 - Jerry Coffin
这相当令人困惑,GCC的文档似乎表明C++不支持此功能。不确定我错过了什么,因为代码看起来肯定不会意外地编译为C。 - unwind
它绝对可以在gcc 4.8.0下编译通过,即使使用了“-pedantic -ansi”选项也没有警告。 - Walter
2个回答

0

每个编译器通常都有自己的语言扩展。 这适用于g++和例如MS VC++。 例如,在MS VC++中,您可以使用语句for each。


好的,那么这是否意味着 g++ 正在向 C++ 添加更多技术上不属于标准的功能? - PJMicolet
是的,就是这样。例如,您可以使用在C++标准中不允许的可变长度数组。 - Vlad from Moscow
1
@PJMicolet 当然会,大多数编译器都会。这被称为“扩展”语言。你可以查看g++对C++的扩展列表 - unwind

-1

看起来你发现了 gcc 编译器的一个特性:一种无法通过任何选项(如 -pedantic -std=XXXX)抑制或警告的未记录扩展。

如果您想要相当确定您的代码符合标准,我建议总是使用多个编译器,并确保您的代码在没有警告的情况下通过它们所有的编译器(并使用最严格的警告选项)。gcc 和 clang 是免费的,所以您可以至少使用两个编译器(而且 clang 在标准合规方面非常出色)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接