Pourquoi utiliser des #define au lieu d'une variable
Quel est le point de #define
en C++? J'ai seulement vu des exemples où il est utilisé à la place d'un "nombre magique" mais je ne vois pas l'intérêt de simplement donner une valeur à une variable à la place.
Vous devez vous connecter pour publier un commentaire.
Surtout stylistique de ces jours. Quand C était jeune, il n'y a pas une telle chose comme une variable const. Donc, si vous avez utilisé une variable au lieu d'une
#define
, vous n'avez aucune garantie que quelqu'un quelque part ne serait pas de changement de la valeur de celui-ci, causant des ravages tout au long de votre programme.Dans les vieux jours, FORTRAN passé même des constantes pour les sous-programmes par référence, et il est possible (et des maux de tête induisant) pour modifier la valeur d'une constante comme '2' être quelque chose de différent. Une seule fois, ce qui s'est passé dans un programme, que je travaillais, et le seul indice que nous avons eu que quelque chose n'allait pas a nous aimerions obtenir un ABEND (anomalie à la fin) quand le programme a frappé le
STOP 999
qui était censé mettre fin normalement.La
#define
fait partie du préprocesseur du langage C et C++. Quand ils sont utilisés dans le code, le compilateur remplace simplement la#define
déclaration avec ce que jamais vous le souhaitez. Par exemple, si vous êtes malade de l'écriturefor (int i=0; i<=10; i++)
tout le temps, vous pouvez effectuer les opérations suivantes:Si vous voulez quelque chose de plus générique, vous pouvez créer des macros du préprocesseur:
Elle est également très utile pour la compilation conditionnelle (l'autre grande utilisation de
#define
) si vous ne souhaitez que certains de code utilisé dans certains build particulière:La plupart des compilateurs qui vous permet de définir une macro à partir de la ligne de commande (par exemple,
g++ -DDEBUG something.cpp
), mais vous pouvez aussi mettre un définissez dans votre code comme suit:Certaines ressources:
#define
pour une constante C++ ces jours-ci. En fait, il est considéré comme l'onu-C++ ou quelque chose comme ça.max
etmin
#define fori(x) for (int i=0; i<=x; i++)
doit être écrit#define fori(x) for (int i=0; i<=(x); i++)
à la place. (Remarque les autres supports.) L'utilisation de parenthèses peut ne pas être évident dans cet exemple, mais quelque chose de mauvais va se passer si quelqu'un a mis une opération au niveau du bit dans l'argument x.J'ai eu des ennuis au travail une seule fois. J'ai été accusé d'avoir utilisé des "nombres magiques" dans la gamme des déclarations.
Comme ceci:
La société a pour politique d'éviter ces numéros de magie, car, il m'a expliqué, que ces chiffres n'étaient pas portable; qu'ils entravé facile d'entretien. J'ai soutenu que, quand je lis le code, je veux savoir exactement comment big le tableau est. J'ai perdu l'argument et donc, un vendredi après-midi, j'ai remplacé la délinquance "nombres magiques" avec #définit, comme ceci:
Sur le lundi après-midi, j'ai été appelée et a accusé d'avoir passive renégats tendances.
#define MARYLYN_SIZE 256
est ce que vous voulez.256
et1024
n'est pas facile à gérer, mais quand on est confronté à ce vous avez décidé de faire pire. Si ce comportement a continué à ma place, vous seriez hors.static constexpr const size_t MAX_HOMES_AVAILABLE = 1024; int Ann[MAX_HOMES_AVAILABLE];
. Si le choix est vraiment évident à localiser puis à l'aide de 1024 directement n'est pas aussi mauvais, mais de faire ce que Harpee fait, c'est juste la pêche à la traîne.#define TWO_FIFTY_SIX 256
à#define TWO_FIFTY_SIX 258
, ce code est à la traîne.#define
peut accomplir certaines tâches que la normale de C++ ne peut pas, comme le gardiennage des en-têtes et d'autres tâches. Toutefois, cela ne devrait pas être utilisé comme un nombre magique - static const doit être utilisé à la place.C ne pas utiliser pour avoir consts, donc #définit étaient la seule manière de fournir des valeurs constantes. À la fois le C et le C++ ne les avons maintenant, il n'est point dans leur utilisation, sauf quand ils sont va être testé avec #ifdef/ifndef.
Plus courantes d'utilisation (autre que pour déclarer des constantes) est un inclure garde.
Définir est évaluée avant la compilation par le pré-processeur, tandis que les variables sont référencés au moment de l'exécution. Cela signifie que vous contrôlez la façon dont votre application est construite (pas la façon dont il fonctionne)
Ici sont un couple d'exemples d'utilisation de définir ce qui ne peut être remplacée par une variable:
#define min(i, j) (((i) < (j)) ? (i) : (j))
remarque c'est évaluée par le pré-processeur, pas au cours de l'exécution
http://msdn.microsoft.com/en-us/library/8fskxacy.aspx
La
#define
vous permet d'établir une valeur dans un en-tête qui serait autrement compiler une taille plus grande que zéro. Votre les en-têtes ne devrait pas compiler une taille plus grande que zéro.EDIT: Comme Neil points dans le commentaire de ce post, la définition explicite-avec-valeur dans l'en-tête serait travailler pour le C++, mais pas C.
const double TAX_RATE = 0.625
. consts traduction de l'appareil par défaut.