определение статических константных структур

этот вопрос связан с Symbian OS, но я думаю, что C / C++ veteran может помочь мне тоже. Я компилирую библиотеку с открытым исходным кодом для Symbian OS. Используя компилятор 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, но незаконным в C++, если это так, то каковы возможности для объявления const structs в C++ ? Если это не так, то любая другая помощь будет оценили.

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

4 ответов


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

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

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

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

который вы бы initalize так:

static const struct Foos foo(1, 2);

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

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

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


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

Я думал, что укажу на это, когда однажды попал в эту ловушку.

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

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

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

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


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