Tabla de contenido
preprocesador C++
Los preprocesadores son directivas que le dicen al compilador qué preprocesamiento debe hacer antes de la compilación real.
Todas las directivas de preprocesador comienzan con un signo de almohadilla (#) y solo pueden aparecer caracteres de espacio antes de una directiva de preprocesador. Las directivas de preprocesamiento no son declaraciones de C++, por lo que no terminan con un punto y coma (;).
Hemos visto que hay directivas #include en todos los ejemplos anteriores . Esta macro se utiliza para incluir archivos de encabezado en archivos de origen.
C++ también admite muchas directivas de preprocesamiento, como #include, #define, #if, #else, #line, etc. Echemos un vistazo a estas importantes directivas.
#define preprocesamiento
La directiva de preprocesamiento #define se usa para crear constantes simbólicas. Esta constante simbólica suele llamarse macro , y la forma general de la instrucción es
#define texto de reemplazo de nombre de macro
Cuando esta línea de código aparece en un archivo, todas las macros posteriores que aparecen en el archivo se reemplazan con texto de reemplazo antes de compilar el programa. Por ejemplo:
#include <iostream>
using namespace std;
#define PI 3.14159
int main ()
{
cout << "Value of PI :" << PI << endl;
return 0;
}
Ahora, probemos este código y veamos el resultado del preprocesamiento. Suponiendo que el archivo de código fuente ya existe, utilice la opción -E para compilar y redirigir el resultado a test.p. Ahora, si observa el archivo test.p, verá que ya contiene mucha información y que los valores en la parte inferior del archivo se han cambiado a los siguientes:
...
int main ()
{
cout << "Value of PI :" << 3.14159 << endl;
return 0;
}
macro de parámetros
Puede usar #define para definir una macro con parámetros como este:
#include <iostream>
using namespace std;
#define MIN(a,b) (a<b ? a : b)
int main ()
{
int i, j;
i = 100;
j = 30;
cout <<"较小的值为:" << MIN(i, j) << endl;
return 0;
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Valor menor: 30
compilación condicional
Hay varias directivas que se pueden usar para compilar selectivamente partes del código fuente del programa. Este proceso se llama compilación condicional.
La estructura del preprocesador condicional es muy similar a la estructura de selección if. Considere el siguiente código de preprocesador:
#ifdef NULL #define NULL 0 #endif
Puede compilar solo durante la depuración, el interruptor de depuración se puede implementar con una macro como esta:
#ifdef DEBUG cerr <<"Variable x = " << x << endl; #terminara si
Si se ha definido la constante simbólica DEBUG antes que la directiva #ifdef DEBUG, se compilará la declaración cerr en el programa . Puede comentar parte de un programa con una declaración #if 0, así:
#if 0 código que no compila #endif
Probemos el siguiente ejemplo:
#include <iostream>
using namespace std;
#define DEBUG
#define MIN(a,b) (((a)<(b)) ? a : b)
int main ()
{
int i, j;
i = 100;
j = 30;
#ifdef DEBUG
cerr <<"Trace: Inside main function" << endl;
#endif
#if 0
cout << MKSTR(HELLO C++) << endl;
#endif
cout <<"The minimum is " << MIN(i, j) << endl;
#ifdef DEBUG
cerr <<"Trace: Coming out of main function" << endl;
#endif
return 0;
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Seguimiento: Dentro de la función principal El mínimo es 30 Seguimiento: Saliendo de la función principal
Operadores # y ##
Los operadores de preprocesamiento # y ## están disponibles tanto en C++ como en ANSI/ISO C. El operador # convierte el token de texto de reemplazo en una cadena entre comillas.
Consulte la siguiente definición de macro:
#include <iostream>
using namespace std;
#define MKSTR( x ) #x
int main ()
{
cout << MKSTR(HELLO C++) << endl;
return 0;
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
HOLA C++
Vamos a ver cómo funciona. No en vano, el preprocesador de C++ pone la siguiente línea:
cout << MKSTR(HOLA C++) << endl;
convertido a:
cout << "HOLA C++" << endl;
El operador ## se usa para concatenar dos tokens. Aquí hay un ejemplo:
#define CONCAT( x, y ) x ## y
Cuando CONCAT aparece en un programa, sus argumentos se concatenan y se usan en lugar de la macro. Por ejemplo, CONCAT(HOLA, C++) en el programa se reemplazará con "HOLA C++", como se muestra en el siguiente ejemplo.
#include <iostream>
using namespace std;
#define concat(a, b) a ## b
int main()
{
int xy = 100;
cout << concat(x, y);
return 0;
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
100
Vamos a ver cómo funciona. No en vano, el preprocesador de C++ pone la siguiente línea:
cout << concat(x, y);
convertido a:
cout << xy;
Macros predefinidas en C++
C++ proporciona algunas macros predefinidas como se muestra en la siguiente tabla:
macro | describir |
---|---|
__LÍNEA__ | Esto incluye el número de línea actual cuando se compila el programa. |
__ARCHIVO__ | Esto incluirá el nombre de archivo actual cuando se compile el programa. |
__FECHA__ | Este contendrá una cadena de la forma mes/día/año que representa la fecha en que el archivo fuente se convirtió en código objeto. |
__TIEMPO__ | Este contendrá una cadena de la forma hora:minuto:segundo que representa la hora en que se compiló el programa. |
Veamos ejemplos de estas macros arriba:
#include <iostream> using namespace std; int main () { cout << "Value of __LINE__ : " << __LINE__ << endl; cout << "Value of __FILE__ : " << __FILE__ << endl; cout << "Value of __DATE__ : " << __DATE__ << endl; cout << "Value of __TIME__ : " << __TIME__ << endl; return 0; }
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Valor de __LINE__: 6 Valor de __FILE__: test.cpp Valor de __DATE__: 28 de febrero de 2011 Valor de __TIME__: 18:52:48
último punto de conocimiento
Operadores # y ##
# El significado de stringificación, # que aparece en la definición de macro es convertir los siguientes parámetros en una cadena.
Cuando se usa como una operación de clasificación, la función principal de # es convertir parámetros de macro en constantes de cadena sin expansión.
- Los espacios en los lados izquierdo y derecho del parámetro de definición de macro se ignorarán y los múltiples espacios entre cada Token del parámetro se convertirán en un solo espacio.
- Cuando los parámetros de definición de macro contienen caracteres que requieren un significado especial, como " o \, serán precedidos automáticamente por el carácter de escape \.
## Símbolos de conexión, conectan parámetros juntos.
Conecte varios Tokens en un Token. Puntos principales:
- No puede ser el primer o último token en una definición de macro.
- Los espacios iniciales y finales son opcionales.
-
Los tipos de datos y las definiciones de variables incluyen definiciones de tipos de datos como enteros, coma flotante, caracteres y punteros, así como la declaración e inicialización de variables.
-
Los operadores y expresiones incluyen operadores aritméticos, operadores relacionales, operadores lógicos, etc., así como reglas de evaluación para expresiones.
-
Las declaraciones de control incluyen declaraciones condicionales, declaraciones de bucle, declaraciones de salto, etc.
-
La transferencia de función y parámetro incluye definición de función, valor de retorno de función y método de transferencia de parámetro (transferencia de valor, transferencia de puntero, etc.).
-
Los arreglos y punteros incluyen definiciones de arreglos, acceso a elementos de arreglos, arreglos multidimensionales, definiciones de punteros, operaciones de punteros, etc.
-
El procesamiento de cadenas incluye la definición de cadenas, operaciones comunes en cadenas (comparación, copia, conexión, división, etc.).
-
Las operaciones de archivos incluyen operaciones comunes como abrir, leer, escribir y cerrar archivos.
-
La gestión de memoria incluye el uso de funciones de asignación de memoria dinámica malloc y free.
escribir al final
Recientemente, el tráfico es cada vez menos, preste atención, recójalo, gracias