2016-08-02 1 views
1

Je travaille sur un projet de compteur intelligent, ARM, compilateur keil. Je veux compiler une partie de la logique plus complexe sous g ++ pour lancer des tests de régression. J'ai un problème avec certains fichiers include qui définissent l'interface avec la pile WMBus que nous avons achetée.Obtenir la définition PACKED_STRUCT intégrée à compiler sous 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 est défini dans un compilateur sensible comprennent fichier:

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

Et je reçois toujours les messages d'erreur suivants:
erreur: types peuvent ne pas être défini dans les types de paramètre

erreur: typedef déclaration invalide dans le paramètre déclaration

Je ne peux donc pas moyen de contourner cela autrement que par la modification du fichier include pour supprimer le PACKED_STRUCT. Évidemment, je ne modifierai pas directement les fichiers, je les copierai, les éditerai et j'utiliserai la directive -I pour trouver mes fichiers modifiés sous G ++

Le message d'erreur semble indiquer que vous ne pouvez pas déclarer un type comme un argument à une macro?

Remarque même si je redéclarer:

#define PACKED_STRUCT(__declaration__, __name__) \ 
    __declaration__ __name__ 

J'utilise le std = C++ 11 g ++ drapeau, mais la suppression de cet indicateur ne résout rien, mais fait un système de fail

est-il de toute façon je peux définir PACKED_STRUCT pour faire le code non modifié compiler sous g ++?

+0

Vous pouvez 'undef' cette macro et écrire votre propre dans le code source, le cas échéant dans votre cas. – LPs

+0

Je pense que 'déclaration de paramètre' signifie des paramètres de fonction, collez la ligne qui le déclenche. – a3f

+0

Undef est inutile. Je ne pense pas que le compilateur gcc autorise un typedef en tant que paramètre. –

Répondre

0

@LP Vous avez raison, même si je ne sais pas pourquoi maintenant. Ce code compile: Je dois avoir un mauvais fichier d'inclusion glissant en quelque sorte.

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;