57 votes

Pourquoi quelqu'un utiliserait-il #define pour définir des constantes?

C'est une question simple mais pourquoi utiliser quelqu'un #define pour définir des constantes?

Quelle est la différence entre

#define sum 1 et const int sum = 1;

Merci d'avance`

43voto

AndreyT Points 139512

#define a de nombreuses applications différentes, mais votre question semble être au sujet d'une application spécifique: la définition nommé constantes.

En C++ il y a rarement une raison d'utiliser #define pour définir nommé constantes.

#define est normalement largement utilisé dans le code C, depuis le langage C est très différent de C++ quand il s'agit de définir des constantes. En bref, const int objets ne sont pas constantes en C, ce qui signifie que C le principal moyen de définir une véritable constante est d'utiliser #define. (Aussi, pour int des constantes, on peut utiliser les énumérations).

42voto

Alok Save Points 115848

Non il ne faut pas!
En fait, On devrait préférer const int sum = 1; sur #define sum 1 pour un certain nombre de raisons:

Étendue En Fonction De Mécanisme:

#defines ne respectent pas les étendues donc il n'y a aucun moyen de créer une classe étendue de l'espace de noms. Tout const variables peut être portée dans les classes.


En évitant Bizarre de magique pendant les erreurs de compilation:

Si vous utilisez #define ceux-ci sont remplacés par le pré-processeur au moment de la précompilation Donc, si vous recevez une erreur lors de la compilation, il sera source de confusion car le message d'erreur l'habitude de consulter le nom de la macro, mais la valeur et il apparaîtra une soudaine valeur, et l'on perdrait beaucoup de temps de suivi vers le bas dans le code.


La facilité de Débogage:

Aussi pour les mêmes raisons mentionnées dans le #2, tandis que le débogage #define fournirait aucune aide vraiment.


Ainsi, pour éviter des situations ci-dessus const sera un meilleur choix.

8voto

Sven Points 10540

Pour l'exemple que vous venez de donner, je voudrais l'utiliser normalement const. Sauf, bien entendu, le #define peut être utilisé pour la compilation conditionnelle ailleurs:

#if SOME_DEFINE == 1
    // Conditional code
#endif

C'est quelque chose que vous ne pouvez pas faire avec une const. Si vous n'avez pas besoin de la valeur pour être accessible à partir du préprocesseur, je dirais que l'utilisation const moins qu'il y a une raison pour laquelle ce n'est pas possible. Il y a quelques trucs à ce sujet dans le C++ FAQ lite, où ils soulignent à juste titre que juste parce que le préprocesseur est "mal", il ne signifie pas que vous n'aurez jamais besoin d'elle.

3voto

Karl Knechtel Points 24349

#define est nécessaire pour faire des choses comme l'inclusion des gardes de travail, parce que le C++ n'est pas un véritable module de système d'importation.

#define provoque un littéral textuelle de substitution. Le préprocesseur comprend la façon de marquer le code source, mais n'ont pas la moindre idée de ce que tout cela signifie réellement. Lorsque vous écrivez #define sum 1, le préprocesseur va sur votre code et un look pour chaque instance du jeton sum et le remplace par le jeton 1.

Cela a une variété de limites: #define sq(x) x * x ne fonctionnera pas bien si vous l'utilisez comme sq(3+3); et à l'aide de #define pour une constante ne respecte pas la portée d'une quelconque manière, ni le fait d'associer toute sorte de type de la constante. Toutefois, #define peut être utilisé (en particulier en combinaison avec certains autres trucs comme l' # et ## préprocesseur opérateurs) pour faire un peu de magie qui par ailleurs n'est pas possible (sauf manuellement en faisant ce que le préprocesseur n').

2voto

malkia Points 1272

Essayez toujours d'utiliser "const int" plutôt que #define.

Utilisez #define, uniquement lorsque votre code de préprocesseur peut être lu par un autre outil et qu'il est plus facile de l'utiliser avec le préprocesseur plutôt que d'analyser le langage.

C'est aussi le seul moyen de définir quelque chose à vérifier ultérieurement par # if / # else / # endif

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