Macros y sus tipos en C/C++

Una macro es una pieza de código en un programa que se reemplaza por el valor de la macro. La macro se define mediante la directiva #define . Cada vez que el compilador encuentra un nombre de macro, reemplaza el nombre con la definición de la macro. Las definiciones de macro no necesitan terminar con un punto y coma ( ; ).
A continuación se muestran los programas para ilustrar el uso de macros en C/C++:
Programa 1: 

C

// C program to illustrate macros
#include <stdio.h>
 
// Macro definition
#define LIMIT 5
 
// Driver Code
int main()
{
    // Print the value of macro defined
    printf("The value of LIMIT"
           " is %d",
           LIMIT);
 
    return 0;
}

C++

// C++ program to illustrate macros
#include <iostream>
using namespace std;
 
// Macro definition
#define LIMIT 5
 
// Driver Code
int main()
{
    // Print the value of macro defined
    cout << "The value of LIMIT"
         << " is " << LIMIT;
 
    return 0;
}
Producción

The value of LIMIT is 5

Programa 2: 

C

// C program to illustrate macros
#include <stdio.h>
 
// Macro definition
#define AREA(l, b) (l * b)
 
// Driver Code
int main()
{
    // Given lengths l1 and l2
    int l1 = 10, l2 = 5, area;
 
    // Find the area using macros
    area = AREA(l1, l2);
 
    // Print the area
    printf("Area of rectangle"
           " is: %d",
           area);
 
    return 0;
}

C++

// C++ program to illustrate macros
#include <iostream>
using namespace std;
 
// Macro definition
#define AREA(l, b) (l * b)
 
// Driver Code
int main()
{
    // Given lengths l1 and l2
    int l1 = 10, l2 = 5, area;
 
    // Find the area using macros
    area = AREA(l1, l2);
 
    // Print the area
    cout << "Area of rectangle"
         << " is: "<<
        area;
 
    return 0;
}
Producción

Area of rectangle is: 50

Explicación: 
Del programa anterior, podemos ver que cada vez que el compilador encuentra AREA(l, b) en el programa, lo reemplaza con la definición de macros, es decir, (l*b) . Los valores pasados ​​a la plantilla de macro AREA(l, b) también serán reemplazados por la declaración (l*b) . Por lo tanto, AREA(10, 5) será igual a 10*5
 tipos de macros 

  1. Macros similares a objetos: una macro similar a un objeto es un identificador simple que será reemplazado por un fragmento de código. Se llama similar a un objeto porque parece un objeto en el código que lo usa. Se usa popularmente para reemplazar un nombre simbólico con numérico/variable representado como constante.
    A continuación se muestra la ilustración de una macro simple:

C

// C program to illustrate macros
#include <stdio.h>
 
// Macro definition
#define DATE 31
 
// Driver Code
int main()
{
    // Print the message
    printf("Lockdown will be extended"
           " upto %d-MAY-2020",
           DATE);
 
    return 0;
}

C++

// C++ program to illustrate macros
#include <iostream>
using namespace std;
 
// Macro definition
#define DATE 31
 
// Driver Code
int main()
{
    // Print the message
    cout << "Lockdown will be extended"
         << " upto " << DATE
         << "-MAY-2020";
 
    return 0;
}
Producción

Lockdown will be extended upto 31-MAY-2020

2. Macros en string: las macros dentro de macros se denominan macros en string. En las macros en string, primero se expande la macro principal y luego se expande la macro secundaria. 
A continuación se muestra la ilustración de una macro de string:

C

// C program to illustrate macros
#include <stdio.h>
  
// Macro definition
#define INSTAGRAM FOLLOWERS
#define FOLLOWERS 138
  
// Driver Code
int main()
{
    // Print the message
    printf("Geeks for Geeks have %dK"
           " followers on Instagram",
           INSTAGRAM);
  
    return 0;
}

C++

// C++ program to illustrate macros
#include <iostream>
using namespace std;
 
// Macro definition
#define INSTAGRAM FOLLOWERS
#define FOLLOWERS 138
 
// Driver Code
int main()
{
    // Print the message
    cout << "Geeks for Geeks have "
         << INSTAGRAM << "K followers on Instagram!";
 
    return 0;
}
Producción

Geeks for Geeks have 138K followers on Instagram

Explicación:  
INSTAGRAM se expande primero para producir SEGUIDORES . Luego, la macro expandida se expande para producir el resultado 138 . Esto se llama el enstringmiento de macros.
 

  3. Macros multilínea: una macro similar a un objeto podría tener una multilínea. Entonces, para crear una macro de varias líneas, debe usar backslash-newline. 
A continuación se muestra la ilustración de las macros multilínea:

C

// C program to illustrate macros
#include <stdio.h>
 
// Multi-line Macro definition
#define ELE 1, \
            2, \
            3
 
// Driver Code
int main()
{
 
    // Array arr[] with elements
    // defined in macros
    int arr[] = { ELE };
 
    // Print elements
    printf("Elements of Array are:\n");
 
    for (int i = 0; i < 3; i++) {
        printf("%d  ", arr[i]);
    }
    return 0;
}

C++

// C++ program to illustrate macros
#include <iostream>
using namespace std;
 
// Multi-line Macro definition
#define ELE 1, \
            2, \
            3
 
// Driver Code
int main()
{
    // Array arr[] with elements
    // defined in macros
    int arr[] = { ELE };
 
    // Print elements
    printf("Elements of Array are:\n");
 
    for (int i = 0; i < 3; i++) {
        cout << arr[i] << ' ';
    }
 
    return 0;
}
Producción

Elements of Array are:
1  2  3  

   4. Macro similar a una función: estas macros son lo mismo que una llamada de función. Reemplaza el código completo en lugar de un nombre de función. Es necesario un par de paréntesis inmediatamente después del nombre de la macro. Si ponemos un espacio entre el nombre de la macro y los paréntesis en la definición de la macro, la macro no funcionará
Una macro similar a una función solo se alarga si su nombre aparece con un par de paréntesis después. Si no hacemos esto, el puntero de función obtendrá la dirección de la función real y dará lugar a un error de sintaxis .
A continuación se muestra la ilustración de macros similares a funciones:

C

// C program to illustrate macros
#include <stdio.h>
 
// Function-like Macro definition
#define min(a, b) (((a) < (b)) ? (a) : (b))
 
// Driver Code
int main()
{
 
    // Given two number a and b
    int a = 18;
    int b = 76;
 
    printf("Minimum value between"
           " %d and %d is %d\n",
           a, b, min(a, b));
 
    return 0;
}

C++

// C++ program to illustrate macros
#include <iostream>
using namespace std;
 
// Function-like Macro definition
#define min(a, b) (((a) < (b)) ? (a) : (b))
 
// Driver Code
int main()
{
 
    // Given two number a and b
    int a = 18;
    int b = 76;
 
    cout << "Minimum value between"
         << a << " and " << b
         << " is: " << min(a, b);
 
    return 0;
}
Producción

Minimum value between 18 and 76 is 18

Aquí hay un ejemplo que le dará una mayor comprensión de las Macros:
Problema: Necesitamos encontrar el área de un círculo definiendo AREA(r) Macros. 

C++

#include <iostream>
using namespace std;
#define  PI  3.1416
#define  AREA(r)  (PI*(r)*(r))
 
int main() {
     
      float r = 7;    // radius of circle
       
    cout<<"Area of Circle with radius " << r <<": "<< AREA(r);
   
    return 0;
}
 
// This code is contributed by balbiriitbombay3602
Producción

Area of Circle with radius 7: 153.938

Publicación traducida automáticamente

Artículo escrito por divya_dashrath_barvekar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *