Элемент инициализатора не является константой -> Цель C - PullRequest
3 голосов
/ 17 мая 2011

Я получаю сообщение об ошибке «Элемент инициализатора не является константой» для следующего объявления.

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**

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

static const int в C объявляет переменную типа int, значение которой можно предположить (при оптимизации) не изменять. Он не объявляет константу, в отличие от C ++.

Если вам нужны целочисленные константы в простом C, вы можете либо использовать макросы, как предлагает предыдущий ответ, либо использовать enum. Обратите внимание, что вам разрешено использовать анонимные enum s; например,

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 также имеет несколько недостатков, не в последнюю очередь известные проблемы случайной множественной оценки побочных эффектов и приоритета операторов.

2 голосов
/ 17 мая 2011

Используйте вместо этого макросы.

#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)

Страшно? Прочитайте this и помните, что это C (на котором основан Objective-C), а не C ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...