web-dev-qa-db-fra.com

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;

47
user788552

#define a de nombreuses applications différentes, mais votre question semble porter sur une application spécifique: la définition de constantes nommées.

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

#define est normalement largement utilisé dans le code C, car le langage C est très différent du C++ lorsqu'il s'agit de définir des constantes. En bref, les objets const int ne sont pas constantes en C, ce qui signifie qu'en C, le moyen principal de définir une constante vraie consiste à utiliser #define. (En outre, pour les constantes int, vous pouvez utiliser des énumérations).

39
AnT

Personne ne devrait pas!
En fait, on devrait préférer const int sum = 1; à #define sum 1 pour plusieurs raisons: 

Mécanisme basé sur la portée:

#defines ne respectent pas les portées, il n’ya donc aucun moyen de créer un espace de noms couvert par une classe. Alors que les variables const peuvent être étendues à des classes.


Eviter les nombres magiques étranges lors d'erreurs de compilation:

Si vous utilisez #define, ceux-ci sont remplacés par le pré-processeur au moment de la précompilation. Ainsi, si vous recevez une erreur lors de la compilation, vous risquez de vous dérouter car le message d'erreur ne fera pas référence au nom de la macro mais à la valeur et et on perdrait beaucoup de temps à le retrouver dans le code. 


Facilité de débogage:

De plus, pour les mêmes raisons que celles mentionnées au point 2, le débogage #define ne fournirait aucune aide. 


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

35
Alok Save

Pour l'exemple que vous venez de donner, j'utiliserais normalement un const. Sauf bien sûr, 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 un const. Si vous n'avez pas besoin que la valeur soit accessible à partir du préprocesseur, utilisez plutôt un const, sauf si cela est impossible. Il existe des éléments à ce sujet dans C++ FAQ lite , où ils soulignent à juste titre que ce n'est pas parce que le pré-processeur est "diabolique" que vous n'en aurez jamais besoin.

8
Sven

#define est nécessaire pour que des éléments tels que les protections d'inclusion fonctionnent, car C++ n'a pas de système d'importation de modulesreal.

#define provoque une substitution textuelle littérale. Le préprocesseur comprend comment segmenter le code source, mais n'a aucune idée de ce que cela signifie réellement. Lorsque vous écrivez #define sum 1, le préprocesseur examine votre code, recherche chaque instance du jeton sum et le remplace par le jeton 1.

Cela a diverses limitations: #define sq(x) x * x ne fonctionnera pas correctement si vous l’utilisez comme sq(3+3); et utiliser #define pour une constante ne respecte aucunement la portée et n'associe aucun type de type à la constante. Cependant, #define peut être utilisé (en particulier en combinaison avec d'autres éléments spéciaux tels que les opérateurs de préprocesseur # et ##) pour effectuer des opérations magiques qui seraient autrement impossibles (sauf en faisant manuellement ce que le préprocesseur fait).

3
Karl Knechtel

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 d'utiliser 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

2
malkia

De Introduction à la programmation en C++ , écrit par Daniel Liang, a déclaré que:

Lorsque vous définissez une constante à l'aide de la directive #define, la constante est non stocké en mémoire.La constante sera remplacée par une valeur par compilateur. Lorsque vous déclarez une constante à l'aide du mot clé const, le constante est stockée dans la mémoire comme variable.

Si constant doit être utilisé dans plusieurs programmes, utilisez #define pour le définir dans le fichier d'en-tête afin de pouvoir l'inclure dans un autre programme. Si constante utilisée dans un seul programme, utiliser const pour déclarer est plus efficace. 

0
John Joe

En mots simples

#define sum 1  /*is pre processed*/

Ce qui signifie que sum n’existe pas une fois l’étape de prétraitement terminée.

const int sum = 1; /*is compiled/linked*/

Ce qui signifie que sum existe jusqu'à ce que l'exécutable soit créé à partir de votre programme.

0
iammilind

const int est juste un int qui ne peut pas changer. #define est une directive destinée au préprocesseur C, ce qui est bien plus que simplement définir des constantes.

Voir ici pour plus de détails: http://en.wikipedia.org/wiki/C_preprocessor

0
robbrit