Die erste Version kompiliert die Prints nur wenn der Debugstatus aktiv ist. Außerdem ist sie etwas umständlich und fehlerhaft.
Sie ersetzt je nach Debugstatus "DEBUG_PRINT(x)" mit "Serial.print(x)" oder mit nichts "". Das funktioniert nur wenn die Variable zum Ausgeben immer "x" ist. Außerdem wird Serial.prinln(x) nicht von Serial.print(x) unterschieden. Da müßte "DEBUG_PRINTLN(x)" stehen. Diese Methode erspart eine Kontrolle im Sketch.
Bessere ist im Sketch bei jedem debug-print zu kontrollieren ob die Debugvariable vorhanden ist oder nicht; also immer bei jeden Serial.print() oder Serial.println() #ifdef DEBUG
Serial.print() #endif
Die 2. Version kompiliert den Debugcode führt ihn aber nur bei aktiven Debugstatus aus.
Die Funktionen braucht es damit was ausgegeben wird. Natürlich ist das nicht schön und hilft auch nicht zur besseren Lesbarkeit beizutragen.
Meine erste korrigierte Version hat den vortei durch auskomentieren von "#define DEBUG" im Sketch auf dem Arduino keine Debugcodes zu haben ohne alle Debug-Prints auszukommentieren oder löschen zu müssen.
uwefed:
"DEBUG_PRINTLN("Server started");" ist da eine andere Suchstring der von "DEBUG_PRINTLN(x)" verschieden ist und darum nicht gefinden wird.
Probier es mal. Du wirst schon sehen ob es funktioniert oder nicht.
Grad probiert:
// #define DEBUG //"Schalter" zum aktivieren
#ifdef DEBUG
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif
void setup()
{
// start the serial for debugging
Serial.begin(115200);
// start the Ethernet connection and the server:
Ethernet.begin(mac, serverIP);
server.begin();
DEBUG_PRINTLN("Server started");
delay(500);
}
...
Das ergibt keine Ausgabe auf der Konsole.
Und das hier:
#define DEBUG //"Schalter" zum aktivieren
#ifdef DEBUG
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif
void setup()
{
// start the serial for debugging
Serial.begin(115200);
// start the Ethernet connection and the server:
Ethernet.begin(mac, serverIP);
server.begin();
DEBUG_PRINTLN("Server started");
delay(500);
}
...
ergibt: Server started auf der Konsole
Das ist jetzt wohl wieder mal "Theorie und Praxis"
MaFu:
Dass das (x) in der Konstante nur als Platzhalter dient solltest Du aber wissen. Das ist gängige Programmierpraxis in C.
Genau, ich bin zwar kein C++ Profi, aber funktionsähnliche Präprozessor-Makros, bei denen Parameter in runden Klammern übergeben werden, sind für unterschiedliche C/C++-Compiler gang und gäbe, nicht nur für AVC GCC. Und der Name des Parameters in so einem Makro ist auch nicht auf x oder nur einen Buchstaben beschränkt, sondern es sind beliebige Parameternamen wie auch überall sonst für die Namen von Funktionsparametern möglich.