为什么这个C数组初始化不能在g ++下编译?

时间:2011-01-28 14:09:14

标签: c++ c arrays initialization

全部 我从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"},
};

5 个答案:

答案 0 :(得分:6)

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

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

  

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

     

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

答案 1 :(得分:5)

以下编译为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接受了这一点。

干杯&第h。,

答案 2 :(得分:0)

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

修改

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

答案 3 :(得分:0)

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

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

编辑:今天我已经了解了指定的初始化。

答案 4 :(得分:-1)

你至少需要一个切入点:

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