【问题标题】:Why won't this C array initialization compile under g++?为什么这个 C 数组初始化不能在 g++ 下编译?
【发布时间】:2011-01-28 14:09:13
【问题描述】:

大家好 我有这个代码取自一个 C 项目。我无法在 g++ 下以任何方式编译它。

我能用这个做什么?

 enum EnumIndexID{
       ID_VALUE_A=2,
       ID_VALUE_B=2
 }

 struct newtype {
     enum MyEnumID eid;
     const char *name;
} table[] = {
     [ID_VALUE_A] = { MyEnumA, "ID_MSG_HeartbeatReq"},
     [ID_VALUE_B] = { MyEnumB, "ID_MSG_HeartbeatReq"},
};

【问题讨论】:

  • 如果这是纯 C 代码,我认为 C++ 标签不属于那里。
  • 您还没有提到您收到的编译错误是什么?
  • ID_VALUE_A 和 ID_VALUE_B 是否打算相同?不过,GCC 似乎对此没有任何问题,只是使用了最后一个初始化程序。
  • 鉴于对以下一些答案的争论,如果您可以更具体地了解您的编译器,那将非常有用。版本号和平台会特别有用。

标签: c++ c arrays initialization


【解决方案1】:

您确定您的编译器支持Designated Initializer 语法吗?

g++ 没有。 从那个超链接:

标准 C89 要求初始值设定项的元素以固定顺序出现,与正在初始化的数组或结构中元素的顺序相同。

在 ISO C99 中,您可以按任何顺序指定元素,指定它们适用的数组索引或结构字段名称,GNU C 也允许将其作为 C89 模式的扩展。 此扩展未在 GNU C++ 中实现

【讨论】:

  • 它至少在良好的旧 Dev C++ 4.9.9.2 中实现。也许您使用了错误的编译器设置?
  • Dev-C++ 使用 GCC 的 mingw 端口 - 也许端口中支持指定初始化程序?他没有详细介绍编译器或他的环境。我仍然怀疑这是问题所在。
【解决方案2】:

以下编译为 C99(注意:它作为 C89 无效):

enum MyEnumID {
    MyEnumA, MyEnumB
};

enum EnumIndexID{
    ID_VALUE_A=2,
    ID_VALUE_B=2
};

struct newtype {
    enum MyEnumID eid;
    const char *name;
} table[] = {
    [ID_VALUE_A] = { MyEnumA, "ID_MSG_HeartbeatReq"},
    [ID_VALUE_B] = { MyEnumB, "ID_MSG_HeartbeatReq"},
};

int main() { return 0; }

编辑:其他人注意到ID_VALUE_AID_VALUE_B 是相同的值,即2。这可能是您代码中的错误。但是,gcc 接受这一点。

干杯,

【讨论】:

  • 事实证明,它也不能编译为 GCC 文档中明确说明的 C++。
  • 所以正确的 GCC 设置应该是 -std=gnu99 或 std=c99。
  • 你说得对,这可能是一个错误,但它符合标准。 AFAIR 是最后的初始化获胜。
【解决方案3】:

第一个枚举定义后缺少分号。

编辑

另外,it turns out that this syntax is supported by GCC but isn't supported by G++ 出于某种原因。

【讨论】:

    【解决方案4】:

    除了enum 定义后缺少分号外,table[] 声明 在语法上不正确 不会在 G++ 上编译:

    struct newtype {
         enum MyEnumID eid;
         const char *name;
    } table[] = {
         { MyEnumA, "ID_MSG_HeartbeatReq"},
         { MyEnumB, "ID_MSG_HeartbeatReq"},
    };
    

    编辑:今天我学习了指定初始化。

    【讨论】:

    • 在添加分号(当然还有 MyEnumID 的定义)后,它在语法上是正确的并且在 G++ 中编译得很好。不过,我不太明白编译器如何处理指定初始化程序中的重复索引。
    • 抱歉,我听错了。它显然受 GCC 支持,但不受 G++ 支持。由于它是纯 C 代码,我一开始并没有使用 G++。
    • 是的,我也是,我刚刚了解了指定初始化器。
    • G++ 不是默认编译为“GCC”吗?即“编译为 C99 减去一些,加上一些 GNU 绒毛”。我相当肯定它应该使用默认编译器设置进行编译。
    • 不,g++ 是 C++ 编译器,与 gcc 不同。
    【解决方案5】:

    你至少需要一个入口点:

    int main() {
    .... lots of other code ...
    }
    

    【讨论】:

    • 你只需要它来链接(并且只有当你的项目是一个应用程序时),而不是编译。
    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2018-04-01
    • 2012-09-01
    • 1970-01-01
    • 2017-04-26
    • 2015-02-09
    相关资源
    最近更新 更多