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

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

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

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

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

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

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


person dudico    schedule 29.03.2009    source источник


Ответы (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) {}
};

Который вы бы инициализировали так:

static const struct Foos foo(1, 2);
person Daniel Sloof    schedule 29.03.2009

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

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

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

person Steve Jessop    schedule 29.03.2009

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

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

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

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

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

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

person Shane Powell    schedule 29.03.2009
comment
Да, я знаю об ограничении статических данных в ОС до 8.1, я использую библиотеку для 9.1 и более поздних версий. В любом случае, спасибо, что сделали это важное замечание! - person dudico; 30.03.2009

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

person Community    schedule 29.03.2009
comment
gcc поддерживает точечную нотацию без каких-либо параметров командной строки. Существуют ли другие компиляторы C? :О - person 2.718; 22.07.2012
comment
К сожалению, да. MSVC, который, насколько я знаю, заморозил поддержку C. - person ; 22.07.2012