Partager via


Macros (C/C++)

Le préprocesseur développe des macros dans toutes les lignes, à l’exception des directives de préprocesseur, des lignes qui ont comme # premier caractère d’espace non blanc. Il développe des macros dans certaines directives qui ne sont pas ignorées dans le cadre d’une compilation conditionnelle. Les directives de compilation conditionnelle vous permettent de supprimer la compilation de parties d’un fichier source. Ils testent une expression constante ou un identificateur pour déterminer les blocs de texte à transmettre au compilateur et ceux à supprimer du fichier source pendant le prétraitement.

La directive #define est généralement utilisée pour associer des identificateurs explicites à des constantes, à des mots clés, ainsi qu'à des instructions et des expressions couramment utilisées. Les identificateurs qui représentent des constantes sont parfois appelés constantes symboliques ou constantes manifestes. Les identificateurs qui représentent des instructions ou des expressions sont appelés macros. Dans cette documentation relative aux préprocesseurs, seul le terme « macro » est utilisé.

Lorsque le nom d’une macro est reconnu dans le texte source du programme ou dans les arguments de certaines autres commandes de préprocesseur, il est traité comme un appel à cette macro. Le nom de la macro est remplacé par une copie du corps de la macro. Si la macro accepte des arguments, les arguments réels suivant le nom de la macro sont substitués aux paramètres formels dans le corps de la macro. Le processus de remplacement d’un appel de macro par la copie traitée du corps est appelé expansion de l’appel de macro.

En pratique, il existe deux types de macro. Les macros de type objet ne prennent aucun argument. Les macros de type fonction peuvent être définies pour accepter des arguments, afin qu’elles ressemblent et agissent comme des appels de fonction. Étant donné que les macros ne génèrent pas d’appels de fonction réels, vous pouvez parfois accélérer l’exécution des programmes en remplaçant les appels de fonction par des macros. (En C++, les fonctions inline sont souvent une méthode préférée.) Toutefois, les macros peuvent créer des problèmes si vous ne les définissez pas et que vous les utilisez avec soin. Vous devrez peut-être utiliser des parenthèses dans les définitions de macros avec des arguments afin de conserver la priorité appropriée dans une expression. En outre, il est possible que les macros ne gèrent pas correctement les expressions avec effets secondaires. Pour plus d’informations, consultez l’exemple de la getrandom directive #define.

Une fois que vous avez défini une macro, vous ne pouvez pas la redéfinir en une autre valeur sans d’abord supprimer la définition d’origine. Toutefois, vous pouvez la redéfinir avec exactement la même définition. Ainsi, la même définition peut apparaître plusieurs fois dans un programme.

La #undef directive supprime la définition d’une macro. Une fois que vous avez supprimé la définition, vous pouvez redéfinir la macro en une autre valeur. La directive #define et la directive #undef traitent respectivement des #define directives et #undef des directives.

Pour plus d'informations, consultez

Voir aussi

Informations de référence sur le préprocesseur C/C++