#ifndef - #endif Error

(deleted)

Du hast mein volles Mitgefühl.
Aber leider kann ich das Problem bei mir nicht reproduzieren.
Entsprechend schwer fällt es mir, auf die Stelle im Code zu zeigen, welche du vor uns/mir verborgen hältst.

mal mit

#define DEBUG_ENABLE 1

probiert?

(deleted)

Ich werde versuchen, ihn so weit zu reduzieren, dass er einigermaßen übersichtlich und das Problem erhalten bleibt.

Das ist immer eine gute Idee!

Die Wahrscheinlichkeit, dass dir der Fehler dabei entgegen springt, selber ins Auge fällt, ist sehr groß.

caroline12:
Beim Compilieren bekomme ich dann den Fehler

#endif without #if

Kannst Du ausschliesssen, das sich irgendwo noch ein weiteres #endif versteckt hat?
Evetl. in einem anderen tab?

Sketch formatieren mit STRG-T - die präpos bleiben vorne stehen.

klappt:

#define DEBUG_ENABLE 1


void setup() {
  Serial.begin(115200);

#ifdef DEBUG_ENABLE
  Serial.println("ifdef");
#endif

#ifndef DEBUG_ENABLE
  Serial.println("ifndef");
#endif
  Serial.println("immer");
}

void loop() {
}

Hallo,

vermutlich hast du mehrere #ifndef / #endif Abschnitte drin und für irgendeins fehlt was dafür. Ähnlich wie bei Anweisungsblöcken. Wenn dabei eine Klammer fehlt gehts nicht.

Eine Alternative zu Makro Orgien wäre enum class.

enum class state : byte {RELEASE, DEBUG};   
const state debugging = state::DEBUG;       // Schalter

void setup (void)
{  
  if (debugging == state::DEBUG)
  {
    Serial.begin(115200);
    Serial.println("\nStart");
  }
}

void loop (void)
{
  
}

Aber zeig erstmal den reduzierten Testcode zum nachvollziehen. Im Grunde brauchst du nur sowas ähnlich kurzes zum testen und kommst vielleicht schon selbst drauf.

byte var = 111;
#define DEBUG_DISABLE   // oder auskommentieren

void setup (void)
{
  #ifndef DEBUG_DISABLE
    var = 222;
  #endif
  Serial.begin(115200);
  Serial.println("\nStart");
  Serial.println(var);
}

void loop (void)
{

}

(deleted)

Der Präprozessor arbeitet Zeilen-orientiert.

Mach nach deinem case 'n': einen Zeilenumbruch und fang das #ifdef in einer neuen Zeile an (mit höchstens Leerzeichen davor).

caroline12:

{

case 'n':  
              #ifndef DEBUG_ENABLE
               Keyboard.write(KEY_RETURN);
               #endif
               Serial.print("ENTER"); Serial.print(" ");
               break;
   default:    break;
}

das geht.

(deleted)

Was auch gut geht ist das:

#define DEBUG

#ifdef DEBUG
  #define debugPrint(...) Serial.print(__VA_ARGS__)
  #define debugPrintln(...) Serial.println(__VA_ARGS__)
  #define debugBegin(...) Serial.begin(__VA_ARGS__)
#else
  #define debugPrint(...)
  #define debugPrintln(...)
  #define debugBegin(...)
#endif

Dann hat man die Makro Abfrage nur einmal und die Debug-Ausgaben sind Einzeiler. Wenn man die erste Zeile auskommentiert wird der Text einfach durch Nichts ersetzt und so nicht vorhanden.

Man kann das auch mit DEBUG = 1 und #if machen. So kann man auch mehrere Ausführlichkeits-Stufen implementieren