Operador de preproceso

Operador de preproceso
Información sobre la plantilla
Concepto:Son sentencias que se sitúan normalmente al principio del código fuente, aunque legalmente pueden aparecer en cualquier punto de la unidad de compilación (tienen validez desde el punto de aparición hasta el final del fichero)

Operador de preproceso. Durante la primera fase de la compilación de un programa, el preprocesador realiza ciertas modificaciones previas en el código fuente. Se trata de una auténtica traducción del código siguiendo unas pautas explicitadas en las denominadas directivas de preproceso. Son sentencias que se sitúan normalmente al principio del código fuente, aunque legalmente pueden aparecer en cualquier punto de la unidad de compilación (tienen validez desde el punto de aparición hasta el final del fichero). Estas directivas no respetan el ámbito, por lo que (en especial los #define) pueden presentar efectos colaterales no deseados en puntos alejados de los que el programador ha previsto. Las directivas de preproceso se identifican por ser líneas precedidas por el símbolo # que es el operador de preproceso. A menos que # esté incluido en una cadena alfanumérica o en un comentario, indica que lo que sigue es una directiva de preproceso o línea de control. # puede estar precedido o seguido por un separador (whitespace) excluyendo nueva línea (NL). Las directivas de preprocesado no necesitan punto y coma ( ; ) al final. Ejemplo:

#include <iostream>;       // L.1:  permisible
#include <iostream>        // L.2:  mejor!!

La línea 1, aunque permisible, puede dar un aviso de compilación con algunos compiladores. Concretamente el compilador Borland C++ 5.5 compila sin ningún aviso, mientras que MS Visual C++ 6.0 muestra un "Warning"

Directivas

El Estándar C++ soporta las directivas que se indican a continuación; todas ellas tienen un sentido definido. La última, #pragma, se ha previsto para que cada fabricante de compilador pueda inventar las suyas particulares sin que interfieran con las de otras implementaciones (si un compilador encuentra una de estas directivas y no sabe que hacer con ella, sencillamente la ignora)

# (directiva nula)
#define
#error
#if,  #elif,  #else,  #endif
#ifdef,  #ifndef
#import
#include
#line
#undef
#pragma

# Directiva nula

La directiva nula consiste en una línea con un solo carácter #. Este línea es ignorada totalmente.

Directiva #define

La directiva #define define una macro. Las macros proporcionan un mecanismo de reemplazo de tokens con o sin una serie de parámetros formales (parecidos a las funciones). Esta similitud con las funciones hace que en ocasiones sirvan para una especie de sustitución inline, aunque esta práctica presenta sus riesgos.

Sintaxis

#define macro_identificador <secuencia-de-tokens>

Directiva #error

La directiva #error genera el siguiente mensaje:

Error: filename line# : Error directive: mensaje-de-error

Esta directiva se suele incluir en sentencias de preprocesado condicional para detectar alguna condición indeseada en tiempo de compilación. Generalmente dicha condición debe ser falsa, pero si resultara cierta, se desea que el compilador muestre un mensaje de error y el proceso se detenga. Esto puede conseguirse incluyendo una directiva #error dentro de una sentencia condicional que resulte cierta en caso de error.

Sintaxis

#error mensaje-de-error

Directivas #if, #elif, #else, #endif

C++ ofrece la posibilidad de compilación condicional mediante la inclusión de ciertas directivas que controlan el comportamiento del preprocesador, de forma que este puede ignorar o compilar determinadas líneas del código en función de ciertas condiciones que son evaluadas durante el preproceso.

Sintaxis

#if k-expresion-1   
<#elif k-expresion-2   
 ...   
<#else    
#endif

Directivas #ifdef, #ifndef

Las directivas #ifdef y #ifndef son condicionales especializadas para comprobar si un macro-identificador está definido o no. La mecánica es la misma que con #if, #elif, #endif .

Sintaxis

#ifdef identificador
#ifndef identificador

Directiva #import

La directiva #import se utiliza para incluir información de una librería de tipos. El contenido de esta librería, la mayoría de las veces describiendo interfaces COM, ActiveX u OLE, es convertido a clases C++.

Sintaxis

#import "filename" [atributos]
o
#import <filename> [atributos]

Directiva #include

La directiva #include carga determinados ficheros denominados, ficheros de inclusión (include files), ficheros de cabecera (header files) o simplemente cabeceras, y los inserta en el código fuente (en el punto de la directiva) que desde ese momento queda sustituida por el texto contenido en el fichero.

Sintaxis

Tiene tres versiones:

#include <nombre_de_cabecera>
#include "nombre_de_cabecera"
#include macro_identificador

Directiva #line

La directiva #line de preprocesado permite definir números de línea en el código fuente, que pueden ser utilizados para referencia o para control de errores. Si un programa consiste en una serie de secciones que derivan a su vez de otro fichero fuente, es útil a veces señalar dichas secciones con los números de línea del fichero original antes que con el número que les corresponde en la secuencia normal tal como resulta el programa compuesto. Esta directiva indica que la siguiente línea de código fuente viene originariamente de la línea constante_entera del fichero nombre_de_fichero. Una vez que el nombre del fichero ha sido registrado en la primera directiva de este tipo, el primer #line, las siguientes que se refieran al mismo fichero no necesitan incluir explícitamente el identificador nombre_de_fichero. Esta directiva es usada principalmente por utilidades RAD que general código C++ automáticamente, y no en el código escrito manualmente por programadores humanos.

Sintaxis

#line constante_entera  <"nombre_de_fichero">

Directiva #undef

Esta directiva permite indefinir una macro previamente definida (#define). Desengancha el macro_identificador de cualquier cuerpo de macro que hubiese sido previamente asignado; el cuerpo es olvidado y el identificador indefinido. Dentro de la línea #undef no se realiza ninguna macro-expansión.

Sintaxis

#undef macro_identificador

Directiva #pragma

La directiva #pragma, permite a los compiladores C++ definir sus directivas particulares (que no corresponden a nada establecido en el estándar ANSI) sin interferir con otros compiladores que soporten este tipo de directivas. Si el compilador no reconoce la etiqueta nombre-de-directiva, la directiva es ignorada sin ningún tipo de mensaje o advertencia.

Sintaxis:

#pragma nombre-de-directiva

Véase también

Fuente