Почему инициализация массива C не будет компилироваться в g ++? - PullRequest
0 голосов
/ 28 января 2011

Привет всем У меня этот код взят из 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 ]

6 голосов
/ 28 января 2011

Вы уверены, что ваш компилятор поддерживает синтаксис Назначенный инициализатор ?

г ++ нет.Из этой гиперссылки:

Стандарт C89 требует, чтобы элементы инициализатора отображались в фиксированном порядке, так же, как порядок элементов в массиве или структуре, которые инициализируются.

В ISO C99 вы можете задавать элементы в любом порядке, указав индексы массива или имена структурных полей, к которым они применяются, и GNU C допускает это как расширение в режиме C89. Это расширение не реализовано в GNU C ++ .

5 голосов
/ 28 января 2011

Следующие скомпилированы как 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; }

EDIT : другие отметили, что ID_VALUE_A и ID_VALUE_B - это одно и то же значение, а именно 2. Возможно, это ошибка в вашем коде. Однако gcc принимает это.

Приветствия & hth.,

0 голосов
/ 28 января 2011

Вы пропустили точку с запятой после первого определения перечисления.

Редактировать

Кроме того, оказывается, что этот синтаксис поддерживается GCC, но непочему-то не поддерживается G ++ .

0 голосов
/ 28 января 2011

Помимо пропущенной точки с запятой после определения enum, объявление table[] не является синтаксически правильным не будет компилироваться в G ++:

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

EDIT: Сегодня я узнал о назначенной инициализации.

0 голосов
/ 28 января 2011

ну вам нужна хотя бы точка входа:

int main() {
.... lots of other code ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...