Commande cpp
Objectif
Effectue une inclusion de fichier et une substitution de macro sur les fichiers source en langage C.
Syntaxe
/usr/ccs/lib/cpp [ -C ] [ -P ] [ -qDBCS ] [ -IRépertoire ] [ -UNom ] [ -DNom [ =Définition ] ] [ -qlanglvl=Langue ] [ InFile ] [ OutFile ]
Descriptif
La commande cpp effectue l'inclusion de fichiers et la substitution de macros sur les fichiers source en langage C. Il lit InFile et écrit dans OutFile (entrée standard et sortie standard par défaut).
La commande cpp est conçue pour être conforme aux directives et instructions de prétraitement pour le langage C telles que définies par le document "Draft American National Standard for Information Systems-Programming Language C" (X3J11/88-159).
Le programme cpp reconnaît les noms spéciaux suivants:
| Article | Descriptif |
|---|---|
| __LIGNE__ | Numéro de ligne en cours. |
| __DATE__ | Date de traduction du fichier source. |
| __TEMPS__ | Heure de la traduction du fichier source. |
| __STDC__ | Indique une implémentation conforme. |
| __FICHIER__ | Nom du fichier en cours. |
| __STR__ | Indique que le compilateur générera du code en ligne pour certaines fonctions de chaîne (comme défini dans /usr/include/string.h). |
| __MATH__ | Indique que le compilateur générera du code en ligne pour certaines fonctions mathématiques (comme défini dans /usr/include/math.h). |
| __ANSI__ | Indique que langlvl est défini sur ANSI. |
| __SAA__ | Indique que langlvl est défini sur SAA. |
| __SAA_L2__ | Indique que langlvl est défini sur SAAL2. |
| __EXTENDED__ | Indique que langlvl est défini comme étant étendu. |
| __HORODATAGE__ | Indique la date et l'heure de la dernière modification du fichier source. |
Toutes les lignes de la directive cpp doivent commencer par le signe # (dièse). Ces directives sont les suivantes:
| Article | Descriptif |
|---|---|
| #define Nom TokenString | Remplace les instances suivantes de Name par TokenString. |
| #define Nom(Argument, ...,Argument) TokenString | Remplace les instances suivantes de la séquence Nom(Argument, . . . ,Argument ) par des chaînes de caractères symboliques, où chaque occurrence d'un Argument dans TokenString est remplacée par le jeton correspondant dans la liste séparée par des virgules. Notez qu'il ne doit pas y avoir d'espace entre Nom et la parenthèse gauche. |
| #undef Nom | Ignore la définition de Nom à partir de ce point. |
| #include "Fichier" ou #include <Fichier > | Inclut à ce stade le contenu de File, que cpp traite ensuite. Si vous mettez File entre " " (guillemets doubles), la commande cpp recherche d'abord dans le répertoire InFile, ensuite dans les répertoires nommés avec l'option -I, et enfin dans les répertoires d'une liste standard. Si vous utilisez la notation <Fichier>, la commande cpp recherche Fichier uniquement dans les répertoires standard. Il ne recherche pas le répertoire dans lequel se trouve InFile . |
| #line Nombre [ "Fichier" ] | Fait en sorte que l'implémentation se comporte comme si la séquence de lignes source suivante commence par une ligne source dont le numéro de ligne est spécifié par Number. Si Fichier est fourni, le nom présumé du fichier est remplacé par Fichier. |
| #erreur TokenString | Génère un message de diagnostic qui inclut TokenString. |
| #pragma TokenString | Instruction définie par l'implémentation du compilateur. |
| #endif | Termine une section de lignes commencées par une directive de test (#if, #ifdefou #ifndef). Chaque directive de test doit avoir un #endifcorrespondant. |
| #ifdef Nom | Place les lignes suivantes dans la sortie uniquement si: Le nom a été défini par un #define précédent OR Nom a été défini par l'indicateur -D , OR Nom est un nom spécial reconnu par la commande cpp , ET Le nom n'a pas été non défini par un #undefintermédiaire, OR Le nom n'a pas été indéfini avec l'indicateur -U drapeau. |
| #ifndef Nom | Place les lignes suivantes dans la sortie uniquement si: Nom n'a jamais été défini par un #defineprécédent, ET Nom n'est pas un nom spécial reconnu par la commande cpp , OR Le nom a été défini par un #define précédent, mais il n'a pas été défini par un #undefintermédiaire, OR Nom est un nom spécial reconnu par la commande cpp, mais il a été indéfini avec le drapeau -U drapeau. |
| Expression #if | Place les lignes suivantes dans la sortie uniquement si Expression a pour résultat une valeur différente de zéro. Tous les opérateurs binaires de non-affectation C, le?: et les opérateurs unary-, !, et-sont autorisés dans Expression. La priorité des opérateurs est la même que celle définie dans le langage C. Il existe également un opérateur unaire défini, qui peut être utilisé dans Expression dans les deux formes suivantes:
|
| Expression #elif | Place les lignes suivantes dans la sortie uniquement si l'expression de la directive #if ou #elif précédente est évaluée à false ou n'est pas définie, et que cette expression est évaluée à true. |
| #else | Place les lignes suivantes dans la sortie uniquement si l'expression de la directive #if ou #elif précédente a pour résultat false ou si elle n'est pas définie (et que, par conséquent, les lignes qui suivent #if et qui précèdent #else ont été ignorées). La condition de chaque directive de test est vérifiée dans l'ordre. S'il est évalué à false (0), le groupe qu'il contrôle est ignoré. Les directives sont traitées uniquement via le nom qui détermine la directive afin de suivre le niveau des conditions imbriquées ; les autres jetons de prétraitement des directives sont ignorés, tout comme les autres jetons de prétraitement du groupe. Seul le premier groupe dont la condition de contrôle a pour résultat true (différent de zéro) est traité. Si aucune des conditions n'est évaluée à true et qu'il existe une directive #else , le groupe contrôlé par #else est traité ; en l'absence d'une directive #else , tous les groupes jusqu'à ce que les #endif soient ignorés. |
Indicateurs
| Article | Descriptif |
|---|---|
| -C | Copie les commentaires en langage C du fichier source vers le fichier de sortie. Si vous omettez cet indicateur, la commande cpp supprime tous les commentaires en langage C, à l'exception de ceux trouvés sur une ligne d'instruction cpp . |
| -DNom[=Définition] | Définit Name comme dans une directive #define . La Définition par défaut est 1. |
| -IRépertoire | Recherche d'abord dans Répertoire, puis recherche dans les répertoires de la liste standard les fichiers #include dont les noms ne commencent pas par une barre oblique (/). Voir la discussion précédente de #include. |
| -P | Prétraite l'entrée sans produire d'informations de contrôle de ligne pour le prochain passage du compilateur C. |
| - qDBCS | Indique le mode de jeu de caractères codés sur deux octets. |
| -UNom | Supprime toute définition initiale de Nom, où Nom est un symbole prédéfini par le préprocesseur (à l'exception des quatre indicateurs de mode de préprocesseur: __ANSI__, __EXTENDED__, __SAA__et __SAA_L2__). Cet indicateur n'est pas reconnu en mode ANSI. |
| -qlanglvl=Langue | Sélectionne un niveau de langage pour le traitement. Le langage peut être ANSI, SAA, SAAL2ou étendu. La valeur par défaut est étendue.Remarque: Lorsque Language est étendu, _NO_PROTO n'est pas défini automatiquement. Cette définition peut être effectuée à l'aide de l'option -D du fichier /etc/xlc.cfg . |
Exemples
- Pour afficher le texte que le préprocesseur envoie au compilateur C, entrez:
Ce prétraitementpgm.cet affiche le texte résultant sur le poste de travail. Vous pouvez afficher la sortie du préprocesseur lorsque vous recherchez des erreurs dans vos définitions de macro./usr/ccs/lib/cpp pgm.c - Pour créer un fichier contenant du texte prétraité plus lisible, entrez:
Ce prétraitementpgm.cet stocke le résultat danspgm.i. Elle omet les informations de numérotation de ligne destinées au compilateur C (-P), et inclut les commentaires du programme (-C)./usr/ccs/lib/cpp -P -C pgm.c pgm.i - Pour prédéfinir des identificateurs de macro, entrez:
Ceci définitBUFFERSIZEavec la valeur512etDEBUGavec la valeur1avant le prétraitement./usr/ccs/lib/cpp -DBUFFERSIZE=512 -DDEBUG pgm.c pgm.i - Pour utiliser les fichiers #include situés dans des répertoires non standard, entrez:
Il recherche dans le répertoire en cours les fichiers #include entre guillemets, puis dans/home/jim/include, puis dans les répertoires standard. Il est en cours de recherche/home/jim/includepour les fichiers #include entre crochets (< >), puis dans les répertoires standard./usr/ccs/lib/cpp -I/home/jim/include pgm.c - Pour prétraiter avec la définition ANSI, entrez:
/usr/ccs/lib/cpp -qlanglvl=ansi pgm.c
Fichiers
| Article | Descriptif |
|---|---|
| /usr/include | Répertoire standard pour les fichiers #include . |