Preprocessor
Le préprocesseur est exécuté lors de la phase de traduction 4 , avant la compilation. Le résultat du prétraitement est un fichier unique qui est ensuite transmis au compilateur proprement dit.
Table des matières |
Directives
Les directives de préprocesseur contrôlent le comportement du préprocesseur. Chaque directive occupe une ligne et a le format suivant :
- le # caractère.
- une séquence de :
-
- un nom de directive défini par la norme (listé ci-dessous ) suivi des arguments correspondants, ou
- un ou plusieurs jetons de préprocessing où le jeton initial n'est pas un nom de directive défini par la norme, auquel cas la directive est conditionnellement supportée avec une sémantique définie par l'implémentation (par exemple, une extension non standard courante est la directive #warning qui émet un message défini par l'utilisateur durant la compilation) (jusqu'à C++23) , ou
- rien, auquel cas la directive n'a aucun effet.
- un saut de ligne.
|
Les directives de module et d'importation sont également des directives de préprocesseur. |
(depuis C++20) |
Les directives de préprocesseur ne doivent pas provenir d'une expansion de macro.
#define EMPTY EMPTY # include <file.h> // pas une directive de préprocesseur
Capacités
Le préprocesseur possède les capacités de traduction des fichiers sources :
- compilation conditionnelle de parties du fichier source (contrôlée par les directives #if , #ifdef , #ifndef , #else , #elif , #elifdef , #elifndef (depuis C++23) , et #endif ).
- remplacement de macros textuelles avec concaténation ou guillemetage d'identifiants (contrôlé par les directives #define et #undef , et les opérateurs # et ## ).
- inclusion d'autres fichiers (contrôlée par la directive #include et vérifiée avec __has_include (depuis C++17) ).
- provoquer une erreur ou un avertissement (depuis C++23) (contrôlé par la directive #error ou #warning respectivement (depuis C++23) ).
Les aspects suivants du préprocesseur peuvent être contrôlés :
- comportement défini par l'implémentation (contrôlé par la directive #pragma et l'opérateur _Pragma (depuis C++11) ). De plus, certains compilateurs prennent en charge (à des degrés divers) l'opérateur __pragma comme extension non standard .
- informations de nom de fichier et de ligne disponibles pour le préprocesseur (contrôlées par la directive #line ).
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| CWG 2001 | C++98 | le comportement lors de l'utilisation de directives non définies par la norme n'était pas clair | rendu conditionnellement supporté |
Voir aussi
|
Documentation C++
pour
Symboles de Macro Prédéfinis
|
|
|
Documentation C++
pour
Index des Symboles de Macro
|
|
|
Documentation C
pour
préprocesseur
|