Manomissione della compilazione.
Considera la seguente situazione: sappiamo come utilizzare le direttive del preprocessore e vogliamo influenzare il processo di compilazione della libreria senza toccare nulla nel file della libreria. È possibile? Si è possibile. Un punto importante: questo trucco funziona solo nel file di intestazione (.h) della libreria, ovvero il file di implementazione .cpp molto probabilmente dovrai scartare il file. Se si definisce define prima di includere il file di libreria, questo define sarà "visibile" dal file di intestazione della libreria e può essere utilizzato per le istruzioni di compilazione condizionale. Un punto importante: quando si crea una libreria, non è consigliabile scrivere il codice esecutivo nel file di intestazione al di fuori della classe, perché ciò comporterà errori quando la libreria viene inclusa in file diversi. Per utilizzare la "magia delle definizioni", è necessario formattare correttamente l'implementazione nel file di intestazione, ad esempio:
Così è possibile
.h
class testClass
{
public:
int func()
{
return 5;
}
private:
};
Così
non è possibile.h
class testClass
{
public:
int func();
private:
};
int testClass::func()
{
return 10;
}
Un esempio di come funziona un define, "adattandosi" a una libreria:
File Pins.h
#pragma once
#include <Arduino.h>
void printResult()
{
// se definito SEND_PINS
#ifdef SEND_PINS
Serial.begin(9600);
Serial.println("Pins");
#endif
}
File Pins.ino
// define
SEND_PINS
// PRIMA di collegare la libreria
#define SEND_PINS
#include <Pins.h>
void setup()
{
// visualizzerà "Pins" se definito SEND_PINS
printResult();
}
void loop()
{
}
Perché è necessario? La compilazione condizionale consente di controllare la compilazione del codice, ovvero di specificare rigidamente quali parti del codice verranno compilate e quali no.