En C/C++, est-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
Que si THING
est un typedef
'd identificateur, et n'est pas définie? Je voudrais faire quelque chose comme ceci:
#ifntypedef thing_type
typedef uint32_t thing_type
#endif
La question se pose parce que je voulais vérifier pour voir si une bibliothèque externe qui a déjà défini les boolean
type, mais je préfère être à l'écoute de plus de solution générale.
- non, il n'est pas
- ... (s'ajoutant à @Ali Veli commentaire) et que vous ne voulez pas qu'il soit.
- Juste pour votre information, si votre compilateur MSVC,
__if_not_exists
est disponible en C++. Par exemple, un code comme celui -__if_not_exists( thing_type ) { typedef uint32_t thing_type; }
est possible. - En C11 et C++ vous êtes autorisé à re-définition de type d'un typedef pour la même chose
Vous devez vous connecter pour publier un commentaire.
N'existe aucun établissement de ce genre en C++ à l'étape de prétraitement. Au max pouvez faire est de
Si ce n'est pas une bonne pratique de codage, et je ne le conseille pas il.
typedef
crée une véritable alias du type, tandis qu'une macro est que texte de substitution. Dans l'exemple, il n'a pas d'importance, mais la sémantique devoid foo( const X x )
sont très différents selon que l'X
est une définition de type ou de la macro ci-dessus:typedef int* X
fera de la fonctionvoid foo( int * const )
, tandis que#define X int*
feravoid foo( int const * )
(sacrémentconst
sur le côté extrême gauche!)Il n'y a pas une telle chose dans la langue, il n'est ni nécessaire. Au sein d'un projet unique, vous ne devriez pas avoir la même définition de type alias se référant à différents types jamais, que c'est une violation de l'ODR, et si vous allez créer le même alias pour le même type, alors, tout simplement. La langue vous permet d'effectuer la même typedef autant de fois que vous le souhaitez et sera généralement attirer ce ODR (au sein de la même unité de traduction):
Si ce que vous avez l'intention de faire est de mettre en œuvre un morceau de fonctionnalités pour les différents types à l'aide d'un typedef pour déterminer lequel utiliser, alors vous devriez être à la recherche à des modèles plutôt que de les typedefs.
C++ ne fournit pas de mécanisme pour le code de test de présence de
typedef
, le mieux que vous peut avoir quelque chose comme ceci:EDIT:
Comme @David, est correcte dans son commentaire, ce qui répond le comment? partie mais surtout manque le pourquoi? Il peut être fait de la manière ci-dessus, Si vous voulez le faire et tout, mais il important que vous n'avez probablement pas besoin de le faire de toute façon, @David réponse & commentaire explique les détails, et je pense que ça répond correctement à la question.
why?
et a sauté sur lehow?
partie. Je vais ajouter une note sur le même.Les directives de préprocesseur (comme
#define
) sont brut de remplacement de texte outils, qui ne savent rien sur le langage de programmation, donc ils ne peuvent pas agir sur n'importe quelle langue niveau des définitions.Il existe deux approches pour s'assurer de type est défini une fois:
#define
un préprocesseur macro côtés le type, et l'utilisation#ifndef
de vérifier pour la définition de la macro avant d'en définir le type.La première option entraîne généralement plus facile à gérer le code. La seconde pourrait provoquer des bogues subtils, si vous avez accidentellement fin avec des définitions différentes d'un type dans un délai d'un programme.
Le problème est réellement la PITA, en raison de certaines Api ou Sdk redéfinir couramment utilisés choses. J'ai eu la question que les fichiers d'en-tête pour une carte du logiciel de traitement (SIG) ont été redéfinir le VRAI et le FAUX (généralement utilisé par windows SDK)mots clés pour les littéraux entiers à la place du vrai et du faux mots-clés ( évidemment, ça peut casser quelque CHOSE). Et oui, la fameuse blague "#define true false" est pertinente.
définir serait jamais se sentir une définition de type ou une constante déclarée en C\C++ code parce que préprocesseur n'a pas d'analyser le code, il ne scanne pour # consolidés. Et il modifie le code avant de le donner à la syntaxe de l'analyseur. DONC, en général, il n'est pas possible.
https://msdn.microsoft.com/en-us/library/5xkf423c.aspx?f=255&MSPPError=-2147217396
Que l'on n'est pas portable, mais il y avait connu demande de mettre en œuvre dans GCC. Je pense que, ça compte aussi comme "extension" dans MSVC. C'est un compilateur de déclaration, pas un préprocesseur déclaration, afin de ne pas "sentir" les macros définies, il permettrait de détecter uniquement les typedefs à l'extérieur du corps de la fonction. "de type complet", il signifie qu'il va réagir sur la définition complète, ignorant des déclarations comme "classe SomeClass;". L'utilisez à votre propre risque.
Edit: apparemment, il a également pris en charge sur mac os maintenant et par Intel comiler avec -fms-dialecte drapeau (AIX\Linux?)
Cela pourrait ne pas répondre directement à la question, mais servir comme une possible solution à votre problème.
Pourquoi ne pas essayer quelque chose comme cela?
Alors si vous voulez personnaliser le type, vous pouvez la définir MY_COOL_TYPE quelque part au-dessus (comme dans "configurer" en-tête est inclus dans le haut de cet en-tête) ou de le passer comme argument de ligne de commande lors de la compilation (comme je sais que vous pouvez le faire avec GCC et LLVM, peut-être d'autres aussi).
Comme d'autres l'ont déjà dit, il n'y a pas une telle chose, mais si vous essayez de créer un alias de type différent, vous obtiendrez une erreur de compilation :
Cependant, il y a un truc qui s'appelle ctag pour trouver d'où une définition de type est défini.
Non, il n'est rien de semblable à ce que tu voulais. J'ai eu le même problème avec les bibliothèques qui contiennent leurs propres
typedefs
pour des choses commebool
. Il devient un problème quand ils ne s'inquiètent pas de ce que vous utilisez pourbool
ou si d'autres libs peut-être faire la même chose!!Voici donc ce que je fais. J'ai modifier le fichier d'en-tête pour les libs qui font de telles choses et de trouver la
typedef bool
et ajouter un peu de code comme ceci:Avis que j'ai compris si je n'avais pas envie d'utiliser les libs' propre
bool typdef
. Cela signifie que vous avez besoin de support C99 ou plus tard.Comme mentionné avant cela n'est pas inclus dans la norme C++, mais vous pourriez être en mesure d'utiliser les autotools pour obtenir la même fonctionnalité.
Vous pouvez utiliser le
ac_cxx_bool
macro assurez-vous bool est défini (ou routines différentes pour les différents types de données).Il n'est pas transparent, mais vous pouvez essayer de le compiler en une seule fois sans typedef (juste à l'aide de l'alias), et voir s'il répond ou non.
La solution que j'ai fini par en utilisant notamment stdbool.h. Je sais que cela ne résout pas la question de comment faire pour vérifier si un typedef est déjà défini, mais il ne permettez-moi de vous assurer que le type booléen est défini.
Sans avoir à utiliser une macro, vous pouvez déterminer si un espace de noms-portée de la définition de type est défini par vérifier si la compilation échoue. Si c'est une définition de type imbriqué dans une structure SFINAE peut être utilisé.
Pour l'espace de noms portée de la définition de type, vous pouvez faire les deux en même temps:
Et puis:
Qui est
some_type
est à la fois un pré-processeur de macro et un typedef.