определение статических константных структур - PullRequest
11 голосов
/ 29 марта 2009

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

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

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

Ответы [ 4 ]

15 голосов
/ 29 марта 2009
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);
5 голосов
/ 30 марта 2009

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

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

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

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

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

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

5 голосов
/ 29 марта 2009

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

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

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

4 голосов
/ 29 марта 2009

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

...