Compile de temps pour vérifier l'existence de stdint.h
Question
Je travaille avec l'héritage code embarqué C qui définit les types uint8_t, uint16_t
et uint32_t
dans un fichier d'en-tête en utilisant le mot-clé typedef
.
Pour la discussion, laissez-nous dire le fichier typedefs.h
contient ces définitions.
Dans mon nouveau module source C, je stdint.h
inclus. Je ajoute aussi d'autres fichiers d'en-tête qui comprennent quelque part typedefs.h
dans la hiérarchie. Comme prévu, le compilateur se plaint de symboles multiples définis.
Je voudrais modifier le fichier héritage typedefs.h
pour qu'il déclare que les types de uint*_t
si l'stdint.h
ne sont pas inclus ou mieux si les types de uint*_t
ne sont pas définis.
Je crois comprendre qu'il #ifndef
ne peut pas être utilisé car typedef
n'est pas une directive préprocesseur.
Alors, comment puis-je dire au compilateur de ne pas définir le uint*_t
si elles existent déjà (ou si le stdint.h
est déjà inclus)?
Note:. Ce serait facile si la norme spécification C définie comprennent des définitions de garde pour les fichiers d'en-tête
FWIW, j'utilise le compilateur Green Hills, 4,24, pour un processeur ARM9.
La solution
Il suffit de fixer l'en-tête de l'héritage toujours inclure stdint.h
pour obtenir ces types, supprimez les définitions en double, et de fournir une goutte dans le fichier stdint.h
pour les systèmes cassés qui en manquent.
Autres conseils
Je beleive que le stdint.h
devrait également définir une macro pour les limites des types qu'il définit. Vous devriez être en mesure de tester pour ceux qui utilisent un #ifdef
et autres.
#ifndef UINT32_MAX
typdef ... uint32_t;
#define UINT32_MAX ...
...
#endif
Edit:. A l'origine utilisé UINT32_MIN, mais comme Jens Gustedt poited c'est une combinaison de signé / non signé et min / max qui ne se produit pas
Si vous êtes sur un système UNIX, alors vous devriez sauvegarder une étape et d'utiliser un logiciel de configuration comme autoconf (1) ou automake (1). Il est conçu pour des problèmes de poignée comme celui-ci.