#define en C++, cómo sí y cómo no

El mayor objetivo de este post es darles a conocer una de las cosas que C++ permite hacer pero que nadie en su sano juicio debería de hacer. ¿Y para que se los enseño entonces? Pues para que si algún día lo ven en un código ajeno sepan qué pinch_ está pasando.

Bueno, antes que nada, #define sirve para dos cosas: definir una constante o crear un macro. Los macros pueden llegar a ser algo difícil de entender, ahora sólo veremos el asunto de las constantes. El asunto aquí es que si yo pongo (fuera del main) una línea así:

#define PI 3.14159265

…significa que cada vez que escribamos PI en nuestro programa, C++ lo interpretará como 3.14159265. Es una simple sustitución.

#define  

Pero el asunto es que se puedes hacer algunas cosas bastantes feas con esta propiedad. Vean este programa:

#include
using namespace std;

#define PI 3.14159265
#define NOF_CHAR 50
#define pause cin.get();cin.get();
#define ct cout
#define cn cin
#define false true

int main()
{
    char name[NOF_CHAR] = {0};
    ct <> name;
    ct << "Bye " << name << "." << endl;
    if(false)
        ct << "P.S. Pi = " << PI;
    pause
}

Tenemos 6 definiciones, ordenadas en su nivel de aceptabilidad:

  • #define PI 3.14159265 y #define NOF_CHAR 50, éstos ejemplifican el uso primario de #define: guardan un valor que es constante durante toda la ejecución del programa.
  • #define pause cin.get();cin.get();, ésta ya empieza a ser no aceptable pero podemos darla por buena porque nos ayuda a leer mejor nuestro código. Ya sabemos que al escribir cin.get();cin.get(); nuestro programa se pausa al igual que con un getch(), pero al usar este #define escribiremos en lugar de eso simplemente pause.
  • #define ct cout y #define cn cin, totalmente inaceptables. Algunas personas usan este tipo de #define’s para escribir menos, pero de verdad que (en la gran mayoría de los casos) no vale la pena el ahorro de caracteres, sólo estamos haciendo nuestro código menos entendible para otras personas.
  • #define false true, este es mas bien como una broma (y es increíble que funcione en verdad), pero si se usa en serio es como una rayada de madre. Si ejecutan el código verán que sí se muestra la línea donde se imprime PI aún que está dentro de un if al que nunca se debería de entrar ¿y porqué sí entra? porque false es true.
Así que ya saben cómo sí y cómo no usar un #define en C++, y ya no están ‘indefensos’ ante programadores con malos hábitos.

12 thoughts on “#define en C++, cómo sí y cómo no

  1. Tengo duda de como hacer este programa, se que lleva switch, if, pero ya me estrese no me saleeeeeee… unicamente me sale lo primero el costo por hora no se como aplicarlo

    1. Se desea construir un programa que ayude a calcular la nomina de la empresa “El Caracol”; cuenta con 5 empleados. Incluye los siguientes elementos:
    a. Número de nomina
    b. Nombre del empleado
    c. Puesto (ver tabla)
    d. Costo por hora(por las primeras 40)
    e. Horas trabajadas
    f. Costo por hora extra(es el doble del costo por hora trabajada)
    g. Horas Extras (es la diferencia de horas trabajas menos 40)
    h. Sueldo Base(horas trabajadas por costo por hora)
    i. Sueldo Extraordinario(horas extras por costo por hora extra)
    j. Sueldo Neto(sueldo base más sueldo extraordinario)
    k. Costo Total(Calcular el total que la empresa pagara a los 5 empleados)
    NOTA: Se deberá desplegar por cada empleado las operaciones realizadas.

    Puesto Costo por Hora
    Gerente $178.96
    Supervisor $125.85
    Empleado $98.23

  2. Hola:
    Aprovecho la oportunidad para felicitar el trabajo realizado en esta página. Dios le colme de bendiciones y más inteligencia para seguir aportando.

    una pregunta: Cuando tendremos los seguidores de esta pagina algo relacionado con estructura de datos con ejemplos sencillos del uso de Lista, Pila, Colas y Arbol binarios. Pienso deben forman parte de este proyecto tan hermoso. Mil gracias.

    1. Muchas gracias en serio. Pues ya espero pronto desocuparme un poco en la escuela y empezar a escribir posts de nuevo, y claro que tendré en cuenta las sugerencias que me diste.

  3. Además de lo expresado en el comentario anterior, ubicar algo referente a la Notacion Polaca Infija, posfija, prefija, como pasar de una a otra, es decir de posfija a infija, o de posfija a prefija. También con ejemplos sencillos como nos tienen acostumbrado.

  4. como se hace para que se introdusca cualquier numero y solo se muestre de ese numero los impares, contando como el 0 como par ej 75648201 sale de resultado 751

  5. hola buenas noches;
    de antemano muchas gracias por la ayuda que me pueda brindar;
    mi problema es el siguiente;

    tengo un juego en c++, en el juego necesito una funcion que me muestre el; tiempo trascurrido, pero necesito que lo que en ese momento tenga pintado; en pantalla no se borre cuando muestre el tiempo. la parte del codigo que;
    se encarga de esa funcion es esta: ;

    void ejem::metodo_1 () {

    clock_t start = clock();
    int n=1;
    int y=1, algo;

    // se supone tengo algo pintado en la pantalla, que seria algo como lo siguiente
    cout << "jugador 1:" << endl
    << "ingresa el numero de la carta que quieres retirar" <> algo;

    // pero cuando ejecuto el siguiente “for” que se encarga del tiempo, se me borra
    // lo que habia escrito antes😦 ;

    for (int i=0;i<n;i++) {
    y = ((int)clock() – start) / CLOCKS_PER_SEC;
    if (i == y) { system ("cls");cout << y ; n++; cout << " _algo";} else { i -=1;}
    }
    cout << endl << endl;
    }

    gracias🙂

  6. gracias por todos tus ejemplos la verdad es que estoy aprendiendo mucho de como programar gracias a alas explicasiones

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s