2016-08-02 19 views
1

Ich arbeite an einem Smart-Meter-Projekt, ARM, Keil-Compiler. Ich möchte einige der komplexeren Logik unter g ++ kompilieren, um Regressionstests auszuführen. Ich habe ein Problem mit einigen Include-Dateien, die die Schnittstelle zum WMBus-Stack definieren, den wir gekauft haben.Getting Embedded PACKED_STRUCT Definition zu kompilieren unter 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 in einem Compiler empfindlich Include-Datei definiert:

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

Und ich folgende Fehlermeldungen immer erhalten:
Fehler: Typen können nicht in den Parametertypen

definiert sein

Fehler: typedef Erklärung ihre Gültigkeit in Parameterdeklaration

Ich kann so keine Möglichkeit, um diese anders als durch die Datei gehören die Bearbeitung der PACKED_STRUCT zu entfernen. Offensichtlich werde ich nicht die Dateien direkt bearbeiten, ich werde sie kopieren, bearbeiten und verwenden Sie die -I-Direktive, um es zu finden meine modifizierten Dateien unter G ++

Die Fehlermeldung scheint zu sagen, dass Sie einen Typ nicht deklarieren können als ein Argument zu einem Makro?

Hinweis, auch wenn ich neu deklarieren:

#define PACKED_STRUCT(__declaration__, __name__) \ 
    __declaration__ __name__ 

Ich bin mit dem -std = C++ 11-Flag g ++ aber dieses Flag Entfernen löst nichts, sondern macht ein System ausfallen umfassen

Gibt es Wie auch immer ich PACKED_STRUCT definieren kann, um den unmodifizierten Code unter g ++ kompilieren zu lassen?

+0

Sie können dieses Makro "undef" und schreiben Sie Ihre eigene in Quellcode, falls in Ihrem Fall anwendbar. – LPs

+0

Ich denke, 'Parameter Deklaration' bedeutet Funktionsparameter, fügen Sie die Linie, die es auslöst. – a3f

+0

undef ist sinnlos. Ich glaube nicht, dass der GCC-Compiler einen Typedef als Parameter erlaubt. –

Antwort

0

@LP Sie haben Recht, obwohl ich nicht sicher bin, warum gerade jetzt. Dieser Code kompiliert: Ich muss eine falsche Include-Datei irgendwie durchschlüpfen.

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;