¿Qué? ¿Aún no sabes qué es el preprocesador de C++? Es suficiente leer este artículo ~

Tabla de contenido

preprocesador C++

#define preprocesamiento

macro de parámetros

compilación condicional

Operadores # y ##

Macros predefinidas en C++

último punto de conocimiento

escribir al final


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.
  1. 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.

  2. Los operadores y expresiones incluyen operadores aritméticos, operadores relacionales, operadores lógicos, etc., así como reglas de evaluación para expresiones.

  3. Las declaraciones de control incluyen declaraciones condicionales, declaraciones de bucle, declaraciones de salto, etc.

  4. 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.).

  5. Los arreglos y punteros incluyen definiciones de arreglos, acceso a elementos de arreglos, arreglos multidimensionales, definiciones de punteros, operaciones de punteros, etc.

  6. El procesamiento de cadenas incluye la definición de cadenas, operaciones comunes en cadenas (comparación, copia, conexión, división, etc.).

  7. Las operaciones de archivos incluyen operaciones comunes como abrir, leer, escribir y cerrar archivos.

  8. 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

Supongo que te gusta

Origin blog.csdn.net/m0_64122244/article/details/130909015
Recomendado
Clasificación