Определение статических конструкций const

Этот вопрос связан с ОС Symbian, но я думаю, что ветеран C/С++ может мне тоже помочь. Я собираю библиотеку с открытым исходным кодом для ОС Symbian. Используя компилятор GCCE, он компилируется без ошибок (после некоторых мастерингов:)). Я сменил компилятор на ARMV5, и теперь у меня есть несколько ошибок с определениями статических конструкций const, например: У меня есть структура:

typedef struct Foos{
    int a;
    int b;
} Foos;

И следующее определение структуры const типа Foos

static const Foos foo = {
    .a = 1,
    .b = 2,
};

GCCE не имеет проблемы с этим, и ARMV5 отправляет "ожидаемое выражение" на ".a = 1,.b = 2". Из того, что я искал в этом отношении, я считаю, что этот метод должен быть законным в C, но незаконным в С++, если это так, то каковы возможности объявления const-структур на С++? Если это не так, то любая другая помощь будет оценена.

Заранее спасибо:)

Ответ 1

static const struct Foos foo = { 1, 2 };

Компилирует как g++, так и gcc.

Вы можете сказать, что, как указывает один из них, определите конструктор:

typedef struct Foos {
    int a;
    int b;
    Foos(int a, int b) : a(a), b(b) {}
};

Что бы вы так активизировали:

static const struct Foos foo(1, 2);

Ответ 2

Это юридическое C99, но не законное C89 или С++. Предположительно, вы компилируете это как С++, поэтому, если вы используете параметры компилятора для обеспечения соответствия стандартам, GCCE также отклонит его.

Вы можете сделать foo = {1, 2}; в C или С++. Очевидно, вы теряете выгоду от имен полей, находящихся прямо там: вы должны полагаться на правильность заказа.

Другим хорошим вариантом в С++ является определение конструктора для вашей структуры и инициализация с помощью static const Foos foo(1,2);. Однако это предотвращает структуру POD, поэтому вы не можете делать те же предположения о ее представлении в памяти.

Ответ 3

Просто обратите внимание, что записываемые статические данные не поддерживается в DLL в некоторых версиях Symbian. Это может не повлиять на то, что вы делаете, поскольку ваши примеры являются константами, или вы можете поддерживать Symbian v8.1b или новее.

Я думал, что хочу указать, как я попал в эту ловушку.

Цитата из ссылки выше:

Поддержка глобального записываемого статического данные на Symbian OS

Symbian OS поддерживает глобальную запись статические данные в EXE для всех версий и трубки.

Версии ОС Symbian на основе Поддержка ядра EKA2 (8.1b и выше) WSD в DLL на целевом оборудовании. Версии 8.1a и ранее, основанные на ядра EKA1, не поддерживают глобальные WSD в DLL.

Ответ 4

Точечное обозначение типа я считаю действительным в ANSI C99. Недействительно ANSI C89. Почти все компиляторы C не реализовали C99.