web-dev-qa-db-fra.com

Pourquoi utiliser #define au lieu d'une variable

Quel est l'intérêt de #define en C++? Je n'ai vu que des exemples où il est utilisé à la place d'un "nombre magique" mais je ne vois pas l'intérêt de simplement donner cette valeur à une variable à la place.

51
Greener

Principalement stylistique de nos jours. Quand C était jeune, il n'existait pas de variable const. Donc, si vous avez utilisé une variable au lieu d'un #define, vous n'aviez aucune garantie que quelqu'un quelque part n'en changerait pas la valeur, causant des ravages tout au long de votre programme.

Autrefois, FORTRAN transmettait même des constantes aux sous-programmes par référence, et il était possible (et induisant des maux de tête) de changer la valeur d'une constante comme "2" pour qu'elle soit différente. Une fois, cela s'est produit dans un programme sur lequel je travaillais, et la seule indication que quelque chose n'allait pas était que nous aurions un ABEND (fin anormale) lorsque le programme a frappé le STOP 999 qui était censé y mettre fin normalement.

41
Paul Tomblin

Le #define Fait partie du langage du préprocesseur pour C et C++. Lorsqu'ils sont utilisés dans du code, le compilateur remplace simplement l'instruction #define Par ce que vous voulez. Par exemple, si vous en avez assez d'écrire for (int i=0; i<=10; i++) tout le temps, vous pouvez effectuer les opérations suivantes:

#define fori10 for (int i=0; i<=10; i++)

// some code...

fori10 {
    // do stuff to i
}

Si vous voulez quelque chose de plus générique, vous pouvez créer des macros de préprocesseur:

#define fori(x) for (int i=0; i<=x; i++)
// the x will be replaced by what ever is put into the parenthesis, such as
// 20 here
fori(20) {
    // do more stuff to i
}

Il est également très utile pour la compilation conditionnelle (l'autre utilisation principale de #define) Si vous ne souhaitez utiliser qu'un certain code dans une version particulière:

// compile the following if debugging is turned on and defined
#ifdef DEBUG
// some code
#endif

La plupart des compilateurs vous permettront de définir une macro à partir de la ligne de commande (par exemple g++ -DDEBUG something.cpp), Mais vous pouvez aussi simplement mettre un define dans votre code comme ceci:

#define DEBUG

Quelques ressources:

  1. article Wikipedia
  2. site spécifique C++
  3. Documentation sur le préprocesseur GCC
  4. référence Microsoft
  5. site spécifique C (je ne pense pas que ce soit différent de la version C++)
115
supercheetah

J'ai eu des ennuis au travail une fois. J'ai été accusé d'utiliser des "nombres magiques" dans les déclarations de tableaux.

Comme ça:

int Marylyn[256], Ann[1024];

La politique de l'entreprise était d'éviter ces nombres magiques parce que, m'ont-ils expliqué, ces nombres n'étaient pas portables; qu'ils empêchaient un entretien facile. J'ai soutenu que lorsque je lis le code, je veux savoir exactement quelle est la taille du tableau. J'ai perdu l'argument et donc, un vendredi après-midi, j'ai remplacé les "nombres magiques" incriminés par #defines, comme ceci:

 #define TWO_FIFTY_SIX 256
 #define TEN_TWENTY_FOUR 1024

 int Marylyn[TWO_FIFTY_SIX], Ann[TEN_TWENTY_FOUR];

Le lundi après-midi suivant, j'ai été appelé et accusé d'avoir des tendances passives et provocantes.

23
Harpee

#define peut accomplir certaines tâches que le C++ normal ne peut pas, comme la protection des en-têtes et d'autres tâches. Cependant, il ne doit certainement pas être utilisé comme un nombre magique - une constante statique doit être utilisée à la place.

7
Puppy

C n'avait pas l'habitude d'avoir des consts, donc #defines était le seul moyen de fournir des valeurs constantes. C et C++ les ont tous les deux maintenant, il est donc inutile de les utiliser, sauf quand ils vont être testés avec # ifdef/ifndef.

7
Neil Butterworth

L'utilisation la plus courante (autre que pour déclarer des constantes) est un include guard .

4
YXD

Define est évalué avant compilation par le préprocesseur, tandis que les variables sont référencées au moment de l'exécution. Cela signifie que vous contrôlez la façon dont votre application est construite (pas comment elle s'exécute)

Voici quelques exemples qui utilisent define qui ne peuvent pas être remplacés par une variable:

  1. #define min (i, j) (((i) <(j))? (i): (j))
    notez que ceci est évalué par le préprocesseur, pas pendant l'exécution

  2. http://msdn.Microsoft.com/en-us/library/8fskxacy.aspx

1
DanJ

Le #define vous permet d'établir une valeur dans un en-tête qui serait autrement compilée à une taille supérieure à zéro. Vos en-têtes ne doivent pas être compilés à une taille supérieure à zéro.

// File:  MyFile.h

// This header will compile to size-zero.
#define TAX_RATE 0.625

// NO:  static const double TAX_RATE = 0.625;
// NO:  extern const double TAX_RATE;  // WHAT IS THE VALUE?

EDIT: Comme Neil le fait remarquer dans le commentaire de cet article, la définition explicite avec valeur dans l'en-tête fonctionnerait pour C++, mais pas C.

0
charley