Präprozessorbefehl wird nicht übernommen ?

Hallo,
ich versuche einen Präprozessorbefehl zu nutzen, der aber nicht so läuft wie ich mir das vorgestellt habe.
Hintergrund: Es geht um einen Datenlogger auf SD-Karte, alles unter der Arduino-IDE 1.8.12 unter Linux Mint 19.3.
Ich möchte über einen #define Befehl am Anfang einen Dateinamen definieren, den ich später mehrfach im Code nutze. Hier soll dem Makro DATEINAME der Wert logdatei.csv zugeordnet werden.

Wenn ich im folgenden Code laufen lasse, dann wird auf der SD-Karte aber nicht die logdatei.csv erzeugt, sondern eine Datei mit dem Namen DATEINAME:

#include <Wire.h>
#include <SPI.h>
#include <SD.h>

#define DATEINAME logdatei.csv

File myFile;
const int chipSelect = 2;

void setup() {  // ###################################
  Serial.begin(115200);
  Serial.println("");
  Serial.print(F("Initializing SD card..."));
  if (!SD.begin(chipSelect)) {
    Serial.println(F("Card failed, or not present"));
    return;
  }
  Serial.println(F("card initialized."));
  if (SD.exists("DATEINAME")) {
    Serial.println("DATEINAME war vorhanden.");
  } else {
    Serial.print("DATEINAME war nicht vorhanden, ");
    myFile = SD.open("DATEINAME", FILE_WRITE);
    myFile.close();
    if (SD.exists("DATEINAME")) {
      Serial.println("wurde dann aber erstellt.");
    } else {
      Serial.println("konnte auch NICHT erstellt werden!");
    }
  }
}

void loop() {
}

Mir erschien die #define Anweisung eigentlich eindeutig, und weiß hier wirklich nicht weiter.

Danke & Gruß,
Tütenflieger

Ist ja klar. Durch die Anführungszeichen. Die gehören ins Makro

Dann werden Wörter in Anführungszeichen nicht durch den Makro ersetzt ???
Ich dachte, die Makros werden gerade durchgängig ersetzt, "ohne Betrachtung der äußeren Umstände".

Ich will eigentlich die Anführungszeichen gerade nicht im Makro drinnen haben, da ich bei den Strings für die Ausgabe dann wieder anfangen müssste die Strings zu splitten etc.

Gruß,
Tütenflieger

kompiliert,
ungetestet.

#include <Wire.h>
#include <SPI.h>
#include <SD.h>

#define DATEINAME "logdatei.csv"

File myFile;
const int chipSelect = 2;

void setup() {  // ###################################
  Serial.begin(115200);
  Serial.println("");
  Serial.print(F("Initializing SD card..."));
  if (!SD.begin(chipSelect)) {
    Serial.println(F("Card failed, or not present"));
    return;
  }
  Serial.println(F("card initialized."));
  if (SD.exists(DATEINAME)) {
    Serial.println(DATEINAME "war vorhanden.");
  } else {
    Serial.print(DATEINAME "war nicht vorhanden, ");
    myFile = SD.open(DATEINAME, FILE_WRITE);
    myFile.close();
    if (SD.exists(DATEINAME)) {
      Serial.println("wurde dann aber erstellt.");
    } else {
      Serial.println("konnte auch NICHT erstellt werden!");
    }
  }
}

void loop() {
}

Dann lass die defines weg, wenn dir deren Funktionalität nicht gefällt.

const char dateiname[]{"logdatei.csv"};

Das ist eine saubere Nummer!

Leitmotiv:

Ein vermiedenes define ist ein gutes define.
Ein vermeidbares define ist ein böses define.

String Literale werden automatisch konkateniert. Da muss man nichts splitten:

void setup()
{
  Serial.begin(9600);
  Serial.println("123" "456");
}

Ok, verstanden. (nachdem ich "konkatenieren" nachschlug...)
Wenn das hier läuft, dann ist es das, was ich haben will.

void setup()
{
  Serial.begin(9600);
  Serial.println("123" "456");
}

Dank an @noiasca & @Serenifly!
@combie: ich weiß, daß #define eher quick'ndirty ist

Tütenflieger

@combie: ich weiß, daß #define eher quick'ndirty ist

Schön!

Hmmm ....
Dann handle doch auch bitte dem entsprechend.

Vorschlag:
(das Streaming funktioniert übrigens auch mit Files, Wire und vielen weiteren Dingen)

#include <Streaming.h>

const char dateiname[]{"logdatei.csv"};


void setup() 
{
  Serial.begin(9600);
  Serial << "Start: "<< __FILE__ << endl;
  Serial << dateiname << "456" << endl;
}

void loop() 
{

}