Получение встроенного определения 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;