Was bedeutet #x in einem C-Makro?

Lesezeit: 3 Minuten

Benutzeravatar von Anders Lind
Anders Lind

Ich habe zum Beispiel ein Makro:

#define PRINT(int) printf(#int "%d\n",int)

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.

Genau dieses Beispiel wird in erklärt dieses Tutorial zum C-Präprozessor (was übrigens der erste Google-Treffer für ist c Makro-Pfundzeichen).

  • ist diese gcc-funktion oder der ansi-c-standard?

    – Anders Lind

    16. Januar 2013 um 5:48 Uhr

  • @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

Benutzeravatar von Jack Peking
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

Benutzeravatar von Karthik T
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

Benutzeravatar von Aagam Sheth
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.

#include<stdio.h> 

#define stringLiteral(sl) #sl

int main()
{
   char StringizeOpreator="a"; 
   printf(stringLiteral(StringizeOpreator));
   return 0;
}

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.

output :
StringizeOperator
...
exitcode 0

Um mehr zu erfahren, besuchen Sie diesen Link:
Stringize-Operator

1411480cookie-checkWas bedeutet #x in einem C-Makro?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy