127 votes

Pourquoi les macros du préprocesseur sont-elles mauvaises et quelles sont les alternatives ?

J'ai toujours posé cette question mais je n'ai jamais reçu de bonne réponse ; je pense que presque tous les programmeurs, avant même d'écrire le premier "Hello World", ont rencontré une phrase comme "les macros ne devraient jamais être utilisées", "les macros sont diaboliques", etc. Avec le nouveau C++11, y a-t-il une réelle alternative après tant d'années ?

La partie facile concerne les macros comme #pragma qui sont spécifiques à la plate-forme et au compilateur, et la plupart du temps, ils présentent de graves défauts tels que #pragma once qui est source d'erreurs dans au moins deux situations importantes : même nom dans des chemins différents et avec certaines configurations de réseau et systèmes de fichiers.

Mais en général, qu'en est-il des macros et des alternatives à leur utilisation ?

3voto

indiangarg Points 51

Les macros en C/C++ peuvent servir d'outil important pour le contrôle de version. Le même code peut être livré à deux clients avec une configuration mineure des macros. J'utilise des choses comme

#define IBM_AS_CLIENT
#ifdef IBM_AS_CLIENT 
  #define SOME_VALUE1 X
  #define SOME_VALUE2 Y
#else
  #define SOME_VALUE1 P
  #define SOME_VALUE2 Q
#endif

Ce type de fonctionnalité n'est pas si facile à réaliser sans macros. Les macros sont en fait un excellent outil de gestion de la configuration logicielle, et pas seulement un moyen de de créer des raccourcis pour réutiliser du code. Définir des fonctions dans le but de les réutilisation dans les macros peut définitivement créer des problèmes.

2voto

indiangarg Points 51

Les macros du préprocesseur ne sont pas mauvaises lorsqu'elles sont utilisées à des fins prévues, par exemple :

  • Créer différentes versions d'un même logiciel en utilisant des constructions de type #ifdef, par exemple la version de Windows pour différentes régions.
  • Pour définir les valeurs liées aux tests de code.

Alternatives - On peut utiliser une sorte de fichiers de configuration au format ini, xml, json à des fins similaires. Mais leur utilisation aura des effets sur le code au moment de l'exécution, ce qu'une macro de préprocesseur peut éviter.

1voto

Davide Icardi Points 2215

D'après mon expérience, les macros ne sont pas idéales pour la taille des programmes et peuvent être difficiles à déboguer. Mais si elles sont utilisées avec précaution, elles sont parfaites.

Les fonctions génériques et/ou les fonctions en ligne constituent souvent une bonne alternative.

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