2016-08-02 7 views
1

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

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__ 

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

ошибка: ЬурейаЯ декларация недействительна в объявлении параметра

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

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

Примечание, даже если я переобъявить:

#define PACKED_STRUCT(__declaration__, __name__) \ 
    __declaration__ __name__ 

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

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

+0

Вы можете 'undef' этот макрос и написать свой собственный в исходном коде, если применимо в вашем случае. – LPs

+0

Я думаю, что «Объявление параметра» означает параметры функции, вставьте строку, которая запускает его. – a3f

+0

undef не имеет смысла. Я не думаю, что компилятор gcc допускает параметр typedef как параметр. –

ответ

0

@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;