Ámbitos con el Pre compilador, 2ª parte

El precompilador es tan poderoso como terrible, porque si bien te ayuda, lo cierto es que obliga a un nivel de abstracción superior, ya que no es posible ni ver ni hacer Serial.print ni debug de su comportamiento: o lo haces bien o te metes en problemas, así de sencillo.

Vamos a ver los riesgos de utilizar el pre compilador sin tener presente su comportamiento:

#include <Arduino.h>

#define A 0
#define B 1
int contadorA = A;
int contadorB = B;

void setup() {
    Serial.begin(9600);
    Serial.println("Hola, estamos a nivel global");
    Serial.println(contadorA);
    Serial.println(contadorB);

    // --- Ahora abramos un ámbito nuevo, para ello, voy a hacer un if

    if ( true ) {

        #define A 3
        #define B 4

        contadorA = A;
        contadorB = B;

        Serial.println("Hola, estamos en el if");
        Serial.println(contadorA);
        Serial.println(contadorB);
        
    }

    // --- Estamos otra vez en ámbito global
    Serial.println("Hola, estamos otra vez a nivel global");
    Serial.println("Por cierto, he cambiado el valor de los contadores");
    Serial.println(contadorA);
    Serial.println(contadorB);

    // --- Realmente estamos en el nivel de ámbito local de setup(), así que...

    #define A 15
    #define B 16

    contadorA = A;
    contadorB = B;


    Serial.println("¡¡ VEAMOS QUE SUCEDE AHORA !!");
    Serial.println(contadorA);
    Serial.println(contadorB);

    /*--Pero esos nuevos define están como locales a setup, ¿qué pasará cuando
        cambie de ámbito?

        ¡¡ Vamos al loop !!
    */

   //#undef A
   //#undef B

}


void loop()
{
    contadorA = A;
    contadorB = B;


    Serial.println("¡¡ LOOP LOCO !!");
    Serial.println(contadorA);
    Serial.println(contadorB);
    
}

El ámbito del precompilador se comporta ligeramente diferente al del namespace, porque ya le había dado valor a la variable, y esta siempre ha sido de ámbito global, así que si te equivocas en el manejo de algo global, aunque el precompilador esté actuando en ámbito local, no hay nada que hacer

Ahora desdefine A y B, acaba con su definición, ya que algo que caracteriza al precompilador es que le puedes pedir que ya no entienda lo que entendía. Para eso dejas las líneas 76 y 77 como código, sin comentario.

Verás que el sketch ya no se puede compilar.

Siempre que uses el precompilador, ten cuidado con ese amigo

Para acabar de comprenderlo, sustituye en el sketch manualmente cada A y cada B por el número que representa y elimina los define y los undef

deff.ino (2.97 KB)