2017-07-24 5 views
0

Ich habe Lose auf stringizing Makros gelesen, aber ich verstehe offensichtlich nicht ganz. Ich möchte eine Zeichenfolge erstellen, bei der das Argument für das Makro zuerst ausgewertet werden muss. Kann mir bitte jemand erklären, wo ich falsch liege oder wie ich das vielleicht besser mache?C Stringize Ergebnis der Gleichung

#define SDDISK   2  // Note defined in a library file elsewhere ie not a constant I know) 

#define DRIVE_STR(d) #d ":/" 
#define xDRIVE_STR(x) DRIVE_STR(x) 
#define FILEPATH(f)  xDRIVE_STR(SDDISK + '0') #f 

const char file[] = FILEPATH(test.log); 

void main(void) 
{ 
    DebugPrint(file); 
} 

Die Ausgabe lautet: "2 + '0':/test.log",
Aber ich will "2: /test.log"

+2

[Lassen Sie einfach die '+' 0''] fallen (http://ideone.com/n9UBZP). – Cornstalks

+0

Warum hast du die '0' gesetzt, wenn du sie nicht willst? –

+0

Makros werden vom Präprozessor erweitert. Der Präprozessor führt auch das Stringizing aus. Danach, wenn der Compiler den Code sieht, ist die '2' bereits in doppelten Anführungszeichen. Daher ist es nicht notwendig, "0" zu "2" hinzuzufügen, um es in das Zeichen "2" zu konvertieren. –

Antwort

0

der C-Präprozessor läuft, bevor der Compiler immer sieht der Code.

Dies bedeutet, dass die Gleichung nicht ausgewertet wird, bevor sie beschriftet wird; Stattdessen wird der Präprozessor nur die gesamte Gleichung stringieren.

In Ihrem Fall wird nur das Entfernen der +'0' das Problem lösen, da der Wert von SDDISK nicht zu einem Zeichen umgewandelt werden muss, bevor es beschriftet wird.

Allerdings sollten Sie tatsächlich benötigen, um eine Berechnung durchzuführen, bevor Sie Zeichenfolgen sollten entweder:

  1. Verwenden CPP constexpr.
  2. Beschweren Sie Ihrem Compiler-Anbieter, dass ein konstanter Ausdruck nicht optimiert wurde.
  3. Verwenden Sie eine Präprozessorbibliothek, um das gewünschte Verhalten zu erzielen.