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:
defined (Nom) ou defined Nom
Cela permet d'utiliser #ifdef et #ifndef dans une directive #if . Seuls les opérateurs, les constantes entières et les noms connus de cpp doivent être utilisés dans Expression. L'opérateur sizeof n'est pas disponible.
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

  1. Pour afficher le texte que le préprocesseur envoie au compilateur C, entrez:
    /usr/ccs/lib/cpp pgm.c
    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.
  2. Pour créer un fichier contenant du texte prétraité plus lisible, entrez:
    /usr/ccs/lib/cpp -P -C pgm.c pgm.i
    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).
  3. Pour prédéfinir des identificateurs de macro, entrez:
    /usr/ccs/lib/cpp -DBUFFERSIZE=512 -DDEBUG 
    pgm.c 
    pgm.i
    Ceci définitBUFFERSIZEavec la valeur512etDEBUGavec la valeur1avant le prétraitement.
  4. Pour utiliser les fichiers #include situés dans des répertoires non standard, entrez:
    /usr/ccs/lib/cpp -I/home/jim/include 
    pgm.c
    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.
  5. 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 .