Pourquoi quelqu'un voudrait-il utiliser des #define pour définir des constantes?
Il est question simple, mais pourquoi quelqu'un voudrait-il utiliser des #define pour définir des constantes?
Quelle est la différence entre
#define sum 1
et const int sum = 1;
- Je suis honnêtement vraiment tenté de dire, "parce qu'ils sont n00bs"... +1 bonne question
- wow , comment puis-je savoir qui est droit , compliqué réponses 😕
- Ouais celui-ci devrait apporter quelques réponses amusantes
- Très simple, si vous êtes à la programmation en C++ -- il suffit de suivre Scott Meyer les conseils de l'Article#1 'Préfère const et inline #define'. Utiliser "#define " comme un dernier recours lorsque const ne fonctionnerait pas. Par exemple, l'en-tête de l'inclusion des gardes etc.
- Vous êtes dangereusement proche de poser une question religieuse
- Voici une astuce pour réduire le risque d'obtenir beaucoup de réponses disparates: ne pas poser une question dans un titre et une autre question dans le corps. Elles sont similaires, mais ont différentes façons de répondre.
- bien sûr, sinon comment peut-il accumuler quelques points de rep vite? 😛
- Les mecs que dois-je faire , est AndreyT répondre par vrai , je ne connais pas les règles, mais encore plus de points pour une réponse signifie qu'il est juste !?
- Le haut/downvote ratio est en aucun cas d'autorité, mais c'est l'opinion de la majorité et en tant que tel, il est une bonne indication pour la correction que vous pouvez obtenir sur DONC. (Cependant, comme @Victor a souligné, dans ce cas, il est d'accord avec les premiers conseils de Scott Meyers a largement acclamé livre. C'est une bien meilleure indication.)
Vous devez vous connecter pour publier un commentaire.
#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
de 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, pourint
constantes, on peut utiliser les énumérations).static
en face deconst int
. En C++const
objets ont une liaison interne par défaut.const int
objets ne sont pas constantes dans C" - Attendez, vraiment? Pourquoi est-ce?const int
objet commecase
étiquette, en tant que champ de bits de taille, car la taille du tableau pour les non-VLA tableau, précisément parce queconst int
objets ne sont pas constantes dans C. Le terme "constante" dans C se réfère aux constantes littérales (comme25
) et enum membres, mais de ne pasconst
objets.Ne devrait 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:
#define
s 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.Éviter 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.Facilité de Débogage:
Aussi pour les mêmes raisons mentionnées dans le #2, tandis que le débogage
#define
apporterait pas aider vraiment.Ainsi, pour éviter des situations ci-dessus
const
sera un meilleur choix.#
en SORTE, alors il fait tout dans big gras.#undef X
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:
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", ça ne veut pas dire que vous n'aurez jamais besoin.
define
s.#define
est nécessaire pour faire des choses comme l'inclusion des gardes de travail, parce que le C++ n'est pas un réel 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 jetonsum
et le remplace par le jeton1
.Cela a une variété de limites:
#define sq(x) x * x
ne fonctionnera pas bien si vous l'utilisez comme unesq(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. Cependant,#define
peut être utilisé (en particulier en combinaison avec certains autres trucs comme la#
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').#pragma once
au lieu de l'inclusion des gardes en C++.#pragma once
est spécifique au compilateur. La Norme ne définit pas le sens de pragmas.Toujours essayer d'utiliser un "const int", plutôt que des #define.
Utiliser des #define, seulement lorsque le préprocesseur code peut être lu par un autre outil, et il est plus facile pour elle d'aller avec le préprocesseur, plutôt que d'analyser la langue.
Aussi que c'est la seule manière de définir quelque chose à vérifier plus tard par #si/#else/#endif
De Introduction à la programmation avec C++ qui a été écrit par Daniel Liang a déclaré que:
Si besoin constant d'être utilisé dans plusieurs programmes, utilisez
#define
de la définir dans fichier d'en-tête de sorte qu'il peut être inclus dans un autre programme. Si la constante utilisée uniquement dans un programme, à l'aide deconst
à déclarer est plus efficace.const int
est juste un int qui ne peuvent pas changer.#define
est une directive du préprocesseur C, ce qui est beaucoup plus que juste pour définir des constantes.Voir ici pour plus de détails: http://en.wikipedia.org/wiki/C_preprocessor
En mots simples
Ce qui signifie, que
sum
n'existe pas après l'étape de prétraitement est fini.Qui signifie
sum
existe jusqu'à l'exécutable est faite de sortir de votre programme.#define
est utilisé sera trop à écrire. C'est pourquoi j'ai gardé les choses simples en disant#define
est prétraité. 🙂La première est une directive de préprocesseur, avant de le compilateur compile le code, il faudra passer par le et remplacez-la somme de 1. Le second déclare une variable en mémoire pour contenir cette quantité. Je suis sûr qu'il peut faire valoir à ce qui est meilleur, mais le "const int" est probablement plus fréquent en C++ (quand il s'agit de constantes numériques).
http://www.geekpedia.com/KB114_What-is-the-difference-between-sharpdefine-and-const.html
const int
ne pas déclarer une variable dans la mémoire, l'article lié est incorrect.const int sum = 1; const int* sum_ptr = ∑
?const int
déclare une variable dans portée. C'est la principale différence par rapport à une constante créé avec#define
. Si à attribuer à la variable de mémoire ou pas, c'est pour le compilateur.