Элемент инициализатора не является константой-> Objective C

#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. Спасибо Аластеру за четкое объяснение перечислений и макросов.