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.

26voto

Cela n'existe pas dans la langue, et ce n'est pas nécessaire. Au sein d'un même projet, vous ne devriez jamais avoir le même alias typedef se référant à des types différents, car cela constitue une violation de l'ODR, et si vous devez créer le même alias pour le même type, faites-le. Le langage vous permet d'exécuter le même typedef autant de fois que vous le souhaitez et il rattrapera généralement cet ODR particulier (dans la même unité de traduction) :

typedef int myint;
typedef int myint;       // OK: myint is still an alias to int
//typedef double myint;  // Error: myint already defined as alias to int

Si vous avez l'intention d'implémenter une fonctionnalité pour différents types en utilisant un typedef pour déterminer lequel utiliser, alors vous devriez vous tourner vers les templates plutôt que les typedefs.

21voto

Alok Save Points 115848

C++ ne fournit pas de mécanisme permettant au code de tester la présence de typedef le mieux que vous puissiez avoir est quelque chose comme ça :

#ifndef THING_TYPE_DEFINED
#define THING_TYPE_DEFINED
typedef uint32_t thing_type 
#endif

EDITAR:
Comme @David, qui a raison dans son commentaire, cela répond à la question suivante comment ? mais il manque surtout le Pourquoi ? Il peut être fait de la manière ci-dessus, si vous voulez le faire et tout, mais important que vous n'avez probablement pas besoin de le faire de toute façon, la réponse et le commentaire de @David explique les détails, et je pense que cela répond à la question correctement.

12voto

iammilind Points 29275

Non, il n'y a pas de telle possibilité en C++ au stade du prétraitement. Le maximum que l'on puisse faire est

#ifndef thing_type
#define thing_type uint32_t 
#endif

Bien que ce ne soit pas une bonne pratique de codage et que je ne le suggère pas.

6voto

Mike Seymour Points 130519

Les directives du préprocesseur (comme #define ) sont des outils de remplacement de texte rudimentaires, qui ne connaissent pas le langage de programmation, et ne peuvent donc pas agir sur les définitions du langage.

Il existe deux approches pour s'assurer qu'un type n'est défini qu'une seule fois :

  • Structurer le code de manière à ce que chaque définition ait sa place et qu'il n'y ait pas besoin de définitions multiples.
  • #define une macro de préprocesseur à côté du type, et utiliser #ifndef pour vérifier la définition de la macro avant de définir le type.

La première option conduit généralement à un code plus facile à maintenir. La seconde pourrait causer des bogues subtils, si vous vous retrouvez accidentellement avec différentes définitions du type dans un même programme.

2voto

BЈовић Points 28674

Comme d'autres l'ont déjà dit, cela n'existe pas, mais si vous essayez de créer un alias de type différent, vous obtiendrez une erreur de compilation :

typedef int myInt;
typedef int myInt;    // ok, same alias
typedef float myInt;  // error

Cependant, il y a une chose appelée ctag pour trouver où un typedef 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