Namespaces
Variants

Preprocessor

From cppreference.net
C++ language
General topics
Preprocessor
Comments
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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 :

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