web-dev-qa-db-fra.com

Quelle est la différence entre #define et const?

Doublons possibles:
Pourquoi quelqu'un utiliserait-il #define pour définir des constantes?
différence entre une macro et une const en c ++
C++ - enum vs const vs #define

Quelle est la différence entre l'utilisation de #define et const pour créer une constante? Y a-t-il un avantage de performance par rapport à l'autre? Naturellement, je préfère utiliser le const mais je vais considérer le #define si elle présente des avantages convenables.

40
afaolek

Le #define directive est une directive préprocesseur; le préprocesseur remplace ces macros par leur corps avant le compilateur le voit même. Considérez-le comme une recherche automatique et remplacez votre code source.

Une déclaration de variable const déclare une variable réelle dans le langage, que vous pouvez utiliser ... eh bien, comme une vraie variable: prendre son adresse, la transmettre, l'utiliser, la convertir/la convertir, etc.

Oh, performances: vous pensez peut-être qu'éviter la déclaration d'une variable permet d'économiser du temps et de l'espace, mais avec tous les niveaux d'optimisation du compilateur, il n'y aura pas de différence, car les valeurs constantes sont déjà substituées et repliées au moment de la compilation. Mais vous gagnez l'énorme avantage de vérifier le type et de faire connaître votre code au débogueur, donc il n'y a vraiment aucune raison de ne pas utiliser de variables const.

75
Kerrek SB

#define crée une entité pour la substitution par le préprocesseur de macro, ce qui est assez différent d'une constante car selon ce que vous définissez, elle sera ou ne sera pas traitée comme une constante. Le contenu d'un #define peut être arbitrairement complexe, l'exemple classique est comme ceci:

#define SQR(x) (x)*(x)

Puis plus tard si utilisé:

SQR(2+3*4)

Cela se transformerait en:

(2+3*4)*(2+3*4)
7
zippy

La différence est que #define est traité par le préprocesseur, ce qui équivaut à un simple remplacement de texte. Les valeurs const définies comme ceci ne sont pas visibles pour le compilateur réel, tandis qu'une variable définie avec le modificateur const est une "variable" typée réelle (enfin pas vraiment cette variable). L'inconvénient de #define est qu'il remplace chaque occurrence du nom, tandis que les variables const obtiennent une recherche normale, vous avez donc moins de risques de nommer les conflits et ce n'est pas sûr pour les types.

L'avantage de #define est qu'il garantit la constance et qu'il n'y aura donc pas de variable de support. Les variables const peuvent ou non être substituées dans le code, donc #define peut être plus rapide dans certaines situations. Cependant, un bon compilateur devrait de toute façon intégrer ces consts et il est peu probable que cela fasse une grande différence dans la plupart des situations, donc je continuerais à utiliser const sauf si vous avez un morceau de code où vous avez vu que le compilateur n'a pas inséré la variable et il est un code très, très performant.

3
Grizzly

#define est un remplacement textuel, il est donc aussi rapide que possible. De plus, il garantit la constance. L'inconvénient est qu'il n'est pas sûr pour le type.

D'un autre côté, les variables const peuvent ou non être remplacées en ligne dans le code. Vous pouvez supprimer la constance, la forçant à être en mémoire (bien qu'elle réside probablement dans la mémoire en lecture seule pour commencer, mais il y a des maux de tête dans les deux cas). Il est garanti que le type est sûr car il porte son propre type avec lui.

Je recommanderais personnellement const pour clarifier votre intention.

1
Blindy

#define A B indique au préprocesseur (une partie du compilateur) de remplacer B partout où il voit A dans le code, et il le fait avant de compiler le code. Vous pourriez (bien que ce soit une idée terrible) faire quelque chose comme #define FALSE TRUE.

Une variable const signifie qu'une fois la variable définie, elle ne peut pas être modifiée, mais elle ne fait rien avec le préprocesseur et est soumise aux règles normales des variables.

0
RC Howe

DEFINE est une instruction de préprocesseur, par exemple #define x 5. Le compilateur prend cette valeur et insérer est l'endroit où vous appelez x dans le programme et générez le fichier objet. Définissez les constantes pour ne pas créer une entrée de symbole dans la table des symboles. SI vous souhaitez déboguer le programme, vous ne trouverez pas x. Utilisez constante autant que possible ce que je pense.

0
Alok