【问题标题】:too many initializers for 'int [0]' c++'int [0]' C++ 的初始化程序太多
【发布时间】:2014-02-04 19:01:20
【问题描述】:

第一:

int k[] ={1,2,3,4,5};

第二:

struct slk
{
    int k[] ={1,2,3,4,5};
};

对于这两个语句,为什么第一个通过编译而第二个给我

错误:'int [0]' 的初始化程序太多。如果我设置 k[5],编译将通过;

这个错误信息是什么意思?注意:在 GNU GCC 版本 4.7.2 上测试的代码

【问题讨论】:

  • 成员的内联初始化是一个完全不同的球赛。要获取第一个示例的直接等效项,您应该在 成员初始化列表 中初始化成员(尽管在有限的情况下您可以像在第二个示例中那样内联)。
  • 它似乎适用于int k[5] = {1,2,3,4,5};,但我无法解释原因。
  • @ValarDohaeris,这更像是“它必须有一定的尺寸才能在课堂上做到这一点”。 IIRC,该标准有明确的规则。

标签: c++ arrays c++11 struct initialization


【解决方案1】:

在 C++11 中,允许使用类内成员初始化器,但基本上与在成员初始化列表中进行初始化相同。因此,数组的大小必须明确说明。

Stroustrup 在他的网站here 上有一个简短的解释。

错误消息意味着您为长度为 0 的数组提供了太多的项目,这是 int [] 在该上下文中计算的结果。

【讨论】:

    【解决方案2】:

    在第一个示例中,实际发生了一些事情(实际内存分配)。计算机很容易计算给它的物品数量,并将其用作容量。在第二种用法中,作为结构的一部分,数组只是结构模板的一部分。在第二种情况下,必须在编译时明确给出并知道大小。这里没有自动计数。它与函数声明与定义以及变量声明(告诉类型但未触及内存)及其调用/使用(程序作用的地方)类似。

    【讨论】:

    • 我觉得这很愚蠢。相同的构造和它的编译器可以在一种情况下推断大小,但在另一种情况下则不能。这有多矛盾?
    【解决方案3】:

    可能在struct 中导致编译器需要您明确指定大小。

    C initialize array within structure(双关语)

    【讨论】:

      【解决方案4】:

      这是两个完全不同的上下文:

      第一个是变量声明(带有初始化子句)。

      第二个是类型定义。

      【讨论】:

        猜你喜欢
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 2019-10-07
        相关资源
        最近更新 更多