#objective-c
#objective-c
Вопрос:
Я получаю ошибку «Элемент инициализатора не является константой» для следующего объявления.
struct EBD_HEADER
{
char x;
int Key;
char Number;
int ID;
int Version;
}EBD_HEAD;
struct EBD_TRAILER
{
int Crc_0;
int Crc_1;
int Etx;
}EBD_TRAIL;
static const int EBD_HEADER_SIZE = sizeof(EBD_HEAD);
static const int EBD_TRAILER_SIZE = sizeof(EBD_TRAIL);
static const int RMH_ENCODED_MSG_OVERHEAD = EBD_HEADER_SIZE
EBD_TRAILER_SIZE; //**error:Intializer Element is not a constant**
Комментарии:
1. static const int RMH_ENCODED_MSG_OVERHEAD = sizeof(EBD_HEAD) sizeof(EBD_TRAIL); Это нормально компилируется. Не знаю почему.
2. @taskinoor: Да, я сделал, как вы сказали, и это работает. Но у меня есть от 7 до 8 таких объявлений, и поэтому я заменил их макросом, как просил меня epatel
3. @ron, да, ответ epatel лучше. Мой даже не является ответом. Мне просто любопытно, что здесь происходит.
Ответ №1:
Вместо этого используйте макросы.
#define EBD_HEADER_SIZE sizeof(EBD_HEAD)
#define EBD_TRAILER_SIZE sizeof(EBD_TRAIL)
#define RMH_ENCODED_MSG_OVERHEAD (EBD_HEADER_SIZE EBD_TRAILER_SIZE)
Чувствуешь себя страшно? Прочтите это и помните, что это C (на котором основан Objective-C), а не C
Комментарии:
1. Большое спасибо, что разъяснили мне суть макросов.
Ответ №2:
static const int
в C объявляется переменная типа int
, значение которой можно считать (при оптимизации) неизменяемым. Он не объявляет константу, в отличие от C .
Если вам нужны целочисленные константы на обычном C, вы можете либо использовать макросы, как предлагается в предыдущем ответе, либо использовать enum
вместо этого. Обратите внимание, что вам разрешено использовать анонимные enum
файлы; например
enum {
EBD_HEADER_SIZE = sizeof (EBD_HEAD),
EBD_TRAILER_SIZE = sizeof (EBD_TRAIL),
RMH_ENCODED_MSG_OVERHEAD = sizeof (EBD_HEAD) sizeof (EBD_TRAIL)
};
Обратите внимание, что использование enum
для этой цели не лишено проблем; таким образом, вы можете объявлять константы только целочисленного типа, и если вы решите использовать именованный enum
(либо через тег, либо через typedef
), стоит отметить, что некоторые компиляторы будут выбирать разные размеры или выравнивания для вашего типа в соответствии с количеством и значениями входящих в него констант.
Очевидно, что использование #define
также имеет несколько недостатков, не в последнюю очередь хорошо известные проблемы случайной множественной оценки побочных эффектов и приоритета оператора.
Комментарии:
1. Спасибо Аластеру за четкое объяснение перечислений и макросов.