Получение встроенного определения PACKED_STRUCT для компиляции под g++

Я работаю над проектом интеллектуального счетчика, ARM, keil compiler. Я хочу скомпилировать более сложную логику в g ++ для запуска регрессионных тестов. У меня проблема с некоторыми включаемыми файлами, определяющими интерфейс к стеку WMBus, который мы приобрели.

PACKED_STRUCT( typedef struct S_WMBUS_ADDR_T
{
    /*! Manufacturer ID */
    uint8_t pc_manufr[WMBUS_ADDR_MANUFR_LEN];
    /*! Ident number */
    uint8_t pc_ident[WMBUS_ADDR_IDENT_LEN];
    /*! Version */
    uint8_t c_version;
    /*! Type */
    uint8_t c_type;
}, s_wmbus_addr_t);

PACKED_STRUCT определен в чувствительном к компилятору включаемом файле:

#elif defined (__GNUC__)
  #define PACKED_STRUCT(__declaration__, __name__) \
    __declaration__ __attribute__ ((__packed__)) __name__

...

#elif defined(__arm__)
  #ifdef __ARMCC_VERSION
    #define PACKED_STRUCT(__declaration__, __name__) \
    __packed __declaration__ __name__

И я всегда получаю следующие сообщения об ошибках:
ошибка: типы не могут быть определены в типах параметров

ошибка: объявление typedef недопустимо в объявлении параметра

Я не могу обойти это иначе, кроме как путем редактирования файла включения, чтобы удалить PACKED_STRUCT. Очевидно, что я не буду редактировать файлы напрямую, я скопирую их, отредактирую их и использую директиву -I, чтобы найти мои измененные файлы в G++

Кажется, в сообщении об ошибке говорится, что вы не можете объявить тип в качестве аргумента макроса?

Обратите внимание, даже если я переформулирую:

#define PACKED_STRUCT(__declaration__, __name__) \
  __declaration__ __name__

Я использую флаг -std= C++11 для g ++, но удаление этого флага ничего не решает, но заставляет систему включать ошибку

Есть ли способ определить PACKED_STRUCT, чтобы неизмененный код компилировался в g++?

1 ответ

@LP Вы правы, хотя я не уверен, почему прямо сейчас. Этот код компилируется: у меня должен быть какой-то неверный файл проскальзывания, каким-то образом проскальзывающий

typedef unsigned char uint8_t;
#define WMBUS_ADDR_MANUFR_LEN 4
#define WMBUS_ADDR_IDENT_LEN 4

#define PACKED_STRUCT(__declaration__, __name__) \
  __declaration__ __attribute__ ((__packed__)) __name__

PACKED_STRUCT( typedef struct S_WMBUS_ADDR_T
{
    /*! Manufacturer ID */
    uint8_t pc_manufr[WMBUS_ADDR_MANUFR_LEN];
    /*! Ident number */
    uint8_t pc_ident[WMBUS_ADDR_IDENT_LEN];
    /*! Version */
    uint8_t c_version;
    /*! Type */
    uint8_t c_type;
}, s_wmbus_addr_t);

s_wmbus_addr_t hello;
Другие вопросы по тегам