Je travaille avec le code C HITLY EMBEDDED qui définit les types Pour la discussion, disons que le fichier Dans mon nouveau module source C, j'inclus Je voudrais modifier le fichier hérité Ma compréhension est que Alors, comment puis-je dire au compilateur de ne pas définir le Remarque: Ceci serait facile si la norme définie de spécification C incluait les définitions de protection pour les fichiers d'en-tête. em> p>
FWIW, j'utilise le compilateur Green Hills, 4.24, pour un processeur ARM9. P> uint8_t, uint16_t code> et
uint32_t code> dans un fichier d'en-tête à l'aide du mot clé code> TypeDEF code> . p>
typedefs.h code> contient ces définitions. P>
stdint.h code>. J'inclus également d'autres fichiers d'en-tête qui incluent
Typefs.h code> quelque part dans la hiérarchie. Comme prévu, le compilateur se plaint de multiples symboles définis. P>
typedefs.h code> de sorte qu'il ne déclare que les types
uint * _t code> si
stdint.h code> n'est pas inclus ou meilleur si les types
uint * _t code> ne sont pas définis. p>
#ifndef code> ne peut pas être utilisé depuis
Typedef code> n'est pas une directive de pré-déprocession. P>
uint * _t code> si ils existent déjà (ou si le
stdint.h code> est déjà inclus)? P >
3 Réponses :
Il suffit de réparer l'en-tête Hegacy pour toujours inclure stdint.h code> pour obtenir ces types, supprimez les définitions en double et fournissez un fichier de dépose
stdint.h code> pour cassé systèmes qui manquent. p>
Je crois que le stdint.h code> doit également définir une macro pour les limites des types qu'il définit. Vous devriez être capable de tester pour ceux qui utilisent un
#Ifdef code> et similaire.
#ifndef UINT32_MAX
typdef ... uint32_t;
#define UINT32_MAX ...
...
#endif
Hm, uint32_min code> n'existe pas.
uint32_max code> ou
int32_min code>
@Jens: Les deux suivants semblent suggérer que de telles définitions sont nécessaires 1) opengroup.org/onlinepubs/000095399/basedefs/stdint.h.html 2) Linux-Documentation.com/fr/man/man0p/stdint.h.html
Oui, je sais, mais mon point est que cela ne nécessite pas de min pour un type non signé, n'est-ce pas, car cela est toujours 0, de toute façon.
@Jets: Ahhh, la lumière. Merci!
Vous recherchez uniquement uint32_max vous dit que si les limites.h a été inclus, pas STDINT.H. Parfois, les gens incluent celui sans l'autre.
Si vous êtes sur un système UNIX, vous devez sauvegarder une étape et utiliser un package de configuration comme Autoconf (1) ou un automate (1). Il est conçu pour gérer des problèmes comme celui-ci. P>
Ceci est un système intégré qui n'utilise pas Unix ni Linux, mais Threadx. De plus, il a été codé avant stdint.h code> est devenu standard.
@THOMAS: Vous exécutez probablement le compilateur Green Hills sur un système d'exploitation autre que THELLX, tel que Linux ou Windows, non? Très peu de compilateurs intégrés sont auto-hébergements. Cela dit, AutoConf / Automake sonnent comme une overkill pour cette situation et ils résolvent un problème différent: «Comment puis-je compiler mon code compilé sur plusieurs plates-formes si elles ont STDINT.H ou non?" Comment puis-je faire mon nouveau Code qui utilise STDINT.H Arrêtez de contrat avec cet ancien code qui définit certains des mêmes types? "