Bedingt Compelieren mit #define #ifdef

Hallo Forum,

ich habe mit
#define xxx
am Anfang des Code eine "Constante" definiert,
später frage ich die Constante ab mit:

#if defined(xxx)
....
#endif

Der Compiler erzeugt den entsprechenden Code.

Jetzt möchte ich dass der Compiler den Code nicht erzeugt und setze den Wert auf "false"

#define xxx false

(In der Beschreibung steht auch, dass am Ende kein ; geschrieben werden darf.)
Aber der Code wird trozdem erzeugt.

In einem anderen Beitrag habe ich folgende Antwort gefunden:
Wenn man das erste #define auskommentiert, wird auch die entsprechende Ausgabe nicht in den Code eingebaut.
Scheint so dass man die #define Anweisung auskommentieren muss. ?

Wie kann ich die Constanten (#define ... #ifdef ) sonst noch Ein/Aus-Schalten ?
Auskommentieren ist eine Möglichkeit, aber mir wäre lieber true und false oder 0 und 1 zu benutzen, oder auch 1 2 3 4 .... dann könnte man mit vergleichen #if defined(x) arbeiten, was noch flexiebler wäre.

Habe auch mit Google gesucht, aber keine entsprechende Antwort gefunden, ausser das Auskommentieren wie oben beschrieben.

Ist das wirklich die einzige Möglichkeit ?

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Es wäre schön gewesen, wenn Du ein aktives Beispiel einstellt hättest, dann hätte man es Dir daran erklären können.

Darum nehme ich jetzt mal meinen Barebone-Code:

// Forensketch  
// https://forum.arduino.cc/

#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming

//#define DEBUG              // Wenn aktiviert, werden Zwischenwerte ausgegeben

#ifdef DEBUG
  #define DBG_PRINTLN(...) Serial << __VA_ARGS__ << endl
#else
  #define DBG_PRINTLN(...)
#endif


void setup()
{
  Serial.begin(115200);
#endif
  Serial << (F("\r\nStart...\r\n")) << endl;
  DBG_PRINTLN(__FILE__);
  DBG_PRINTLN( __TIMESTAMP__);
}

void  loop()

{}

Daran sollte erkennbar sein, das Du ein #define brauchst um festzulegen, was passiert und einen elseZweig der ausgeführt wird, wenn die nicht aktiviert ist...

Du fragst mit #ifdef BLAH ab, ob die Präprozessorvariable BLAH überhaupt definiert wurde. Der Ersatzwert ist dabei uninteressant. Also ändert #define BLAH false nix daran, dass BLAH immer noch definiert ist und deswegen liefert #ifdef BLAH auch immer noch WAHR zurück.

Eigentlich macht man das üblicherweise anders, man kann nämlich in Präprozessorstatements auch Werte abfragen. Du könntest also schreiben:

#define BLAH 1
...

#if BLAH == 1
...
#else
... 
#endif

und dann im #define BLAH einen anderen Ersatzwert geben, wenn du den #else-Teil aktivieren möchtest.

Danke Miq1

das war DIE Lösung. :slight_smile:

Warum findet man das nicht in der Hilfe ?

Es gibt halt viele Wege nach Rom. Du könntest auch Deine #ifdef-Variante behalten, müsstest dann aber am Anfang entweder #define BLAH oder #undef BLAH benutzen, um die richtige Weiche zu stellen.

In welcher Hilfe?

In der Arduino Referenz?
Das ist der falsche Ort!
Das ist die Arduino Referenz, nicht die Sprachreferenz.

Der Präprozessor wird mit der Sprache C++ geliefert.
Dort schauen.
z.B.: In der Gcc Doku.

Oder hier und den dortigen Links folgen.

Hallo combie

aber in Arduino-Referenz - Arduino-Referenz
ist auch eine Beschreibung

grafik

nur dass hier ein Link auf #define - Arduino-Referenz
gesetzt ist, und da ist das nicht erkklärt, was ich an dieser Stelle aber vermisse.

Habe ich dir doch gesagt, dass die Arduino Referenz nur für die Arduinofunktionalität taugt.
Nicht als Sprachreferenz.
Ich danke dir, für diese Bestätigung.

Punkt 1:
Du musst mir nicht glauben.

Punkt 2:
Wenn dir was in der Arduino Doku nicht gefällt, dann kannst du es ändern.

Es gibt übrigens auch
#undef XYZ

danach (in den folgenden Code-Zeilen) ist es so, als ob nirgends vorher ein
#define XYZ oder ein
-DXYZ bei den Compileroptionen
gewesen wäre

#6? :wink:

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.