7
votes

Compilez l'existence de la vérification du temps de STDINT.H

Je travaille avec le code C HITLY EMBEDDED qui définit les types uint8_t, uint16_t et uint32_t dans un fichier d'en-tête à l'aide du mot clé TypeDEF .

Pour la discussion, disons que le fichier typedefs.h contient ces définitions.

Dans mon nouveau module source C, j'inclus stdint.h . J'inclus également d'autres fichiers d'en-tête qui incluent Typefs.h quelque part dans la hiérarchie. Comme prévu, le compilateur se plaint de multiples symboles définis.

Je voudrais modifier le fichier hérité typedefs.h de sorte qu'il ne déclare que les types uint * _t si stdint.h n'est pas inclus ou meilleur si les types uint * _t ne sont pas définis.

Ma compréhension est que #ifndef ne peut pas être utilisé depuis Typedef n'est pas une directive de pré-déprocession.

Alors, comment puis-je dire au compilateur de ne pas définir le uint * _t si ils existent déjà (ou si le stdint.h est déjà inclus)?

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.

FWIW, j'utilise le compilateur Green Hills, 4.24, pour un processeur ARM9.


0 commentaires

3 Réponses :


5
votes

Il suffit de réparer l'en-tête Hegacy pour toujours inclure stdint.h pour obtenir ces types, supprimez les définitions en double et fournissez un fichier de dépose stdint.h pour cassé systèmes qui manquent.


0 commentaires

7
votes

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


5 commentaires

Hm, uint32_min n'existe pas. uint32_max ou int32_min


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



0
votes

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.


2 commentaires

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 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? "