Ich weiß ungefähr, was das Ergebnis ist. Aber wie kommt es, dass #int das Ganze repräsentiert?
Ich vergesse dieses Detail irgendwie. Kann mir jemand netterweise einen Tipp geben?
Vielen Dank!
Mögliches Duplikat dieses stackoverflow.com/questions/10676999/stringizing-operator
– Omkant
16. Januar 2013 um 5:40 Uhr
In diesem Kontext (angewandt auf einen Parameterverweis in einer Makrodefinition) bedeutet das Nummernzeichen, dass dieser Parameter auf den wörtlichen Text des Arguments erweitert wird, das an das Makro übergeben wurde.
In diesem Fall, wenn Sie anrufen PRINT(5) die Makroerweiterung wird sein printf("5" "%d\n", 5); was drucken wird 5 5; nicht sehr nützlich; jedoch, wenn Sie anrufen PRINT(5+5) die Makroerweiterung wird sein printf("5+5" "%d\n", 5+5); was drucken wird 5+5 10etwas weniger trivial.
@AndersLind: Dies ist Standardverhalten. Siehe §6.10.3.2/2, der die Semantik von detailliert beschreibt # Operator.
– Traumlax
16. Januar 2013 um 5:51 Uhr
Eigentlich 5+510. Leerzeichen zwischen Zeichenketten werden ignoriert (nicht in Leerzeichen ` ` konvertiert).
– Friedrich Gauss
2. August 2014 um 18:11 Uhr
Jetzt ist diese Frage der erste Google-Treffer für “C-Makro-Pfundzeichen” 🙂
– verrückt
20. April 2017 um 5:56 Uhr
@FrancescoBoi Und für das erste Beispiel 55 würde stattdessen gedruckt werden 5 5
– Benutzer16217248
14. Januar um 4:52
Jack Peking
“#” kann den Namen einer Variablen anzeigen, es ist besser, das Makro wie folgt zu definieren:
#define PRINT(i) printf(#i " = %d\n", i)
und benutze es so:
int i = 5;
PRINT(i);
Ergebnis angezeigt:
i = 5
Karthik T
Das ist eine schlechte Namenswahl für den Makroparameter, aber harmlos (danke dreamlax).
Grundsätzlich, wenn ich so schreibe
PRINT(5);
Es wird als ersetzt
printf("5" "%d\n",5);
oder
printf("5 %d\n",5);
Es ist ein Prozess namens Stringifizierung#int wird durch einen String ersetzt, der aus seinem Inhalt besteht, 5 -> “5”
Das Makro wird durch den Präprozessor erweitert, der keine Kenntnis des C-Typ-Systems hat. Soweit ich weiß int verstößt gegen keine Regeln in §6.10 (Vorverarbeitungsanweisungen), aber ich stimme zu, dass es eine schlechte Wahl ist.
– Traumlax
16. Januar 2013 um 5:46 Uhr
Ihr Link zur Stringification-Dokumentation ist tot, bitte aktualisieren.
– DeathByTensors
16. Mai 2017 um 18:45 Uhr
@DrewBuckley behoben!
– Karthik T
17. Mai 2017 um 9:36 Uhr
"5 %d\n" falsch "5%d\n" Rechts
– Benutzer16217248
14. Januar um 4:53
Aagam Sheth
‘#’ wird Stringize-Operator genannt. Stringize-Operator setzt den übergebenen Parameter in Anführungszeichen und gibt eine Zeichenfolge zurück. Es wird nur in Marco-Anweisungen verwendet, die die Argumente übernehmen.
Hier die stringLiteral Marco übernimmt das formale Argument sl und kehrt zurück #sl. Tatsächlich übergebenes Argument ist StringizeOpreator Variable. Die Rückgabeerklärung #sl hat # Operator, der das Argument like in Anführungszeichen setzt "StringizeOpreator" und gibt einen String zurück.
Die Ausgabe des obigen Programms ist also der Name des aktuellen Parameters ‘StringizeOpreator’ und nicht der Wert, der im übergebenen aktuellen Parameter gespeichert ist.
Mögliches Duplikat dieses stackoverflow.com/questions/10676999/stringizing-operator
– Omkant
16. Januar 2013 um 5:40 Uhr