Mandato cpp

Finalidad

Realiza la inclusión de archivos y la sustitución de macros en archivos fuente de lenguaje C.

Sintaxis

/usr/ccs/lib/cpp [ -C ] [ -P ] [ -qDBCS ] [ -IDirectory ] [ -UNombre ] [ -DNombre [=Defin ition ]] [ -qlanglvl=Idioma ] [ InFile ] [ OutFile ]

Descripción

El mandato cpp realiza la inclusión de archivos y la sustitución de macros en archivos de origen de lenguaje C. Lee InFile y escribe en OutFile (entrada estándar y salida estándar de forma predeterminada).

El mandato cpp está diseñado para ajustarse a las directivas e instrucciones de preproceso para el lenguaje C tal como se define en el documento "Draft American National Standard for Information Systems-Programming Language C" (X3J11/88-159).

El programa cpp reconoce los siguientes nombres especiales:

Elemento Descripción
__LINE__ El número de línea actual.
__FECHA__ La fecha de traducción del archivo de origen.
__TIEMPO__ Hora de traducción del archivo de origen.
__STDC__ Indica una implementación compatible.
__ARCHIVO__ El nombre de archivo actual.
__STR__ Indica que el compilador generará código en línea para determinadas funciones de serie (tal como se define en /usr/include/string.h).
__MATEMÁTICAS__ Indica que el compilador generará código en línea para determinadas funciones matemáticas (tal como se define en /usr/include/math.h).
__ANSI__ Indica que langlvl se ha establecido igual a ANSI.
__SAA__ Indica que langlvl se ha establecido igual a SAA.
__SAA_L2__ Indica que langlvl se ha establecido igual a SAAL2.
__EXTENDIDO__ Indica que langlvl se ha establecido igual a extended.
__TIMESTAMP__ Indica la fecha y hora en que se modificó por última vez el archivo de origen.

Todas las líneas de directiva cpp deben empezar con un # (signo de almohadilla). Estas directivas son:

Elemento Descripción
#define Nombre TokenString Sustituye las instancias posteriores de Nombre por TokenString.
#define Nombre(Argumento, ...,Argumento) TokenString Reemplaza las instancias posteriores de la secuencia Nombre(Argumento, . . . ,Argumento ) con TokenString, donde cada aparición de un Argumento en TokenString se sustituye por el token correspondiente en la lista separada por comas. Tenga en cuenta que no debe haber ningún espacio entre Nombre y el paréntesis izquierdo.
#undef Nombre Ignora la definición de Nombre a partir de este punto.
#include "Archivo" o #include <Archivo > Incluye en este punto el contenido del Archivo, que cpp procesa a continuación.

Si incluye el archivo en "" (comillas dobles), el comando cpp busca primero en el directorio de InFile, segundo en los directorios nombrados con la bandera -I, y por último en los directorios de una lista estándar.

Si utiliza la notación <Archivo>, el mandato cpp busca Archivo sólo en los directorios estándar. No busca en el directorio en el que reside InFile .

#line Número ["Archivo"] Hace que la implementación se comporte como si la siguiente secuencia de líneas de origen comenzara con una línea de origen que tiene un número de línea especificado por Número. Si se proporciona Archivo , el nombre supuesto del archivo se cambia a Archivo.
#error TokenString Genera un mensaje de diagnóstico que incluye TokenString.
#pragma TokenString Instrucción definida por implementación para el compilador.
#endif Finaliza una sección de líneas iniciada por una directiva de prueba (#if, #ifdefo #ifndef). Cada directiva de prueba debe tener un #endifcoincidente.
#ifdef Nombre Coloca las líneas subsiguientes en la salida sólo si:

El nombre ha sido definido por un #define anterior

O

Nombre se ha definido mediante el distintivo -D ,

O

Nombre es un nombre especial reconocido por el mandato cpp ,

Y

Nombre no ha sido desdefinido por una #undefinterviniente,

O

El nombre no se ha definido con la -U.

#ifndef Nombre Coloca las líneas subsiguientes en la salida sólo si:

Nombre nunca ha sido definido por un #defineanterior,

Y

Nombre no es un nombre especial reconocido por el mandato cpp ,

O

Nombre ha sido definido por un #define anterior pero no ha sido definido por un #undefintermedio,

O

El nombre es un nombre especial reconocido por el comando cpp, pero no se ha definido con la -U.

#if Expresión Coloca las líneas subsiguientes en la salida sólo si Expresión se evalúa como no cero. Todos los operadores C binarios no de asignación, el signo?: y los operadores unarios-,! y-son legales en Expresión. La prioridad de los operadores es la misma que la definida en el lenguaje C. También hay un operador unario definido, que se puede utilizar en Expresión en estos dos formatos:
defined (Name) o defined Name
Esto permite el programa de utilidad de #ifdef y #ifndef en una directiva #if . Sólo estos operadores, constantes enteras y nombres conocidos por cpp se deben utilizar en Expresión. El operador sizeof no está disponible.
#elif Expresión Coloca las líneas subsiguientes en la salida sólo si la expresión de la directiva #if o #elif anterior se evalúa como falsa o no está definida, y esta Expresión se evalúa como verdadera.
#else Coloca las líneas subsiguientes en la salida sólo si la expresión de la directiva #if o #elif anterior se evalúa como falsa o no está definida (y, por lo tanto, las líneas que siguen a #if y que preceden a #else se han ignorado).

La condición de cada directiva de prueba se comprueba en orden. Si se evalúa en false (0), el grupo que controla se omite. Las directivas se procesan sólo a través del nombre que determina la directiva con el fin de realizar un seguimiento del nivel de condicionales anidados; el resto de las señales de preproceso de las directivas se ignoran, al igual que las otras señales de preproceso del grupo. Sólo se procesa el primer grupo cuya condición de control se evalúa como verdadera (distinto de cero). Si ninguna de las condiciones se evalúa como verdadera y hay una directiva #else , se procesa el grupo controlado por #else ; falta una directiva #else , se omiten todos los grupos hasta #endif .

Distintivos

Elemento Descripción
-C Copia los comentarios de lenguaje C del archivo de origen en el archivo de salida. Si omite este distintivo, el mandato cpp elimina todos los comentarios de lenguaje C excepto los que se encuentran en una línea de directiva cpp .
-DNombre[=Definición] Define Nombre como en una directiva #define . La Definición predeterminada es 1.
-IDirectorio Busca primero en Directorioy, a continuación, busca en los directorios de la lista estándar los archivos #include con nombres que no empiezan por una/(barra inclinada). Consulte la discusión anterior de #include.
-P Preprocesa la entrada sin producir información de control de línea para la siguiente pasada del compilador C.
- qDBCS Especifica la modalidad de juego de caracteres de doble byte.
-UNombre Elimina cualquier definición inicial de Nombre, donde Nombre es un símbolo predefinido por el preprocesador (excepto para los cuatro indicadores de modalidad de preprocesador: __ANSI__, __EXTENDED__, __SAA__y __SAA_L2__). Este distintivo no se reconoce en modalidad ANSI.
-qlanglvl=Idioma Selecciona un nivel de idioma para el proceso. El lenguaje puede ser ANSI, SAA, SAAL2o ampliado. El valor predeterminado es ampliado.

Nota: Cuando se amplía Language , _NO_PROTO no se define automáticamente. Esta definición se puede realizar utilizando la opción -D del archivo /etc/xlc.cfg .

Ejemplos

  1. Para visualizar el texto que el preprocesador envía al compilador C, entre:
    /usr/ccs/lib/cpp pgm.c
    Esto preprocesapgm.cy muestra el texto resultante en la estación de trabajo. Es posible que desee ver la salida del preprocesador cuando busque errores en las definiciones de macro.
  2. Para crear un archivo que contenga más texto preprocesado legible, entre:
    /usr/ccs/lib/cpp -P -C pgm.c pgm.i
    Esto preprocesapgm.cy almacena el resultado enpgm.i. omite la información de numeración de líneas destinada al compilador C (-P), e incluye comentarios de programa (-C).
  3. Para predefinir identificadores de macro, especifique:
    /usr/ccs/lib/cpp -DBUFFERSIZE=512 -DDEBUG 
    pgm.c 
    pgm.i
    Esto defineBUFFERSIZEcon el valor512yDEBUGcon el valor1antes del preproceso.
  4. Para utilizar archivos #include ubicados en directorios no estándar, entre:
    /usr/ccs/lib/cpp -I/home/jim/include 
    pgm.c
    Esto busca en el directorio actual los archivos #include entrecomillados y, a continuación, en/home/jim/includey, a continuación, en los directorios estándar. Busca en/home/jim/includepara archivos #include entre corchetes (< >) y, a continuación, en los directorios estándar.
  5. Para preprocesar con la definición ANSI, especifique:
    /usr/ccs/lib/cpp -qlanglvl=ansi pgm.c

Archivos

Elemento Descripción
/usr/include Directorio estándar para archivos #include .