51 votes

En C/C++, existe-t-il une directive similaire à #ifndef pour les typedefs ?

Si je veux définir une valeur uniquement si elle n'est pas définie, je fais quelque chose comme ceci :

#ifndef THING
#define THING OTHER_THING
#endif

Et si THING est un typedef d, et non défini ? Je voudrais faire quelque chose comme ceci :

#ifntypedef thing_type
typedef uint32_t thing_type
#endif

Le problème s'est posé parce que je voulais vérifier si une bibliothèque externe avait déjà défini la fonction boolean mais je serais ouvert à une solution plus générale.

2voto

mondaugen Points 11

Cela peut ne pas répondre directement à la question, mais constituer une solution possible à votre problème.

Pourquoi ne pas essayer quelque chose comme ça ?

#define DEFAULT_TYPE int // just for argument's sake
#ifndef MY_COOL_TYPE
     #define MY_COOL_TYPE DEFAULT_TYPE
#endif
typedef MY_COOL_TYPE My_Cool_Datatype_t;

Ensuite, si vous voulez personnaliser le type, vous pouvez soit définir MY_COOL_TYPE quelque part au-dessus (comme dans un en-tête "configure" qui est inclus en haut de cet en-tête) ou le passer comme argument de ligne de commande lors de la compilation (pour autant que je sache, vous pouvez le faire avec GCC et LLVM, peut-être d'autres aussi).

2voto

Swift Points 6

Le problème est en fait un véritable PITA, car certaines API ou SDK redéfinissent des éléments couramment utilisés. J'ai eu l'occasion de constater que les fichiers d'en-tête d'un logiciel de traitement de cartes (SIG) redéfinissaient les mots-clés TRUE et FALSE (généralement utilisés par le SDK Windows) en littéraux entiers au lieu des mots-clés true et false (évidemment, cela peut casser QUELQUE CHOSE). Et oui, la célèbre blague "#define true false" est pertinente.

définir ne sentirait jamais un typedef ou une constante déclarée en C \C ++ code car le préprocesseur n'analyse pas le code, il ne recherche que les # déclarations. Et il modifie le code avant de le donner à l'analyseur syntaxique. Donc, en général, ce n'est pas possible.

https://msdn.microsoft.com/en-us/library/5xkf423c.aspx?f=255&MSPPError=-2147217396 Celui-ci n'est pas encore portable, bien qu'il y ait eu une demande connue pour l'implémenter dans GCC. Je pense que cela compte aussi comme une "extension" dans MSVC. C'est une déclaration du compilateur, pas du préprocesseur, donc il ne "sentira" pas les macros définies, il détectera seulement les typedefs en dehors du corps de la fonction. L'expression "full type" signifie qu'il réagira à la définition complète, en ignorant les déclarations comme "class SomeClass ;". Utilisez-le à vos risques et périls.

Edit : apparemment il est aussi supporté sur MacOS maintenant et par le compilateur Intel avec l'option -fms-dialect (AIX). \Linux ?)

1voto

SeanRamey Points 302

Non, il n'y a rien qui ressemble à ce que tu voulais. J'ai eu le même problème avec des bibliothèques qui incluent leur propre code d'accès. typedefs pour des choses comme bool . Cela devient un problème quand ils ne se soucient pas de ce que vous utilisez pour bool ou si d'autres libéraux font la même chose !

Voici donc ce que je fais. J'édite le fichier d'en-tête pour les librairies qui font ce genre de choses et je trouve l'option typedef bool et ajoutez un code comme celui-ci :

#ifdef USE_LIBNAME_BOOL
typedef unsigned char bool; // This is the lib's bool implementation
#else
#include <stdbool.h>
#endif

Notez que j'ai inclus si je ne voulais pas utiliser les librairies propres bool typdef . Cela signifie que vous avez besoin du support C99 ou plus.

0voto

Tim Points 491

Comme indiqué précédemment, cette fonctionnalité n'est pas incluse dans la norme C++, mais vous pouvez utiliser les outils automatiques pour obtenir la même fonctionnalité.

Vous pourriez utiliser le ac_cxx_bool pour s'assurer que bool est défini (ou différentes routines pour différents types de données).

0voto

Zach Rattner Points 5849

La solution que j'ai fini par utiliser était d'inclure stdbool.h. Je sais que cela ne résout pas la question de savoir comment vérifier si un typedef est déjà défini, mais cela me permet de m'assurer que le type booléen est défini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X