Определение статических конструкций 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.