Was ist das für ein Makro?

Lesezeit: 2 Minuten

Dabei bin ich auf folgenden Code gestoßen:

#include<stdio.h>
#define d(x) x(#x[3])
int main(){
d(putchar);
}

Welche Drucke c als Ausgang. Ich frage mich, was das Makro tut #define d(x) x(#x[3]) tut? In der C-Sprache gibt es einen Operator wie #? Ich kann dies im Makrokörper sehen, dh hier x(#x[3]). Nach meinem normalen Auge sieht es etwas anders aus, was ich in der C-Sprache sehe, aber eigentlich Was macht das?

Bearbeiten : Was ist der wahre Nutzen von # in der realen Welt?

Ich bin ein Anfänger in C und es wird gut sein, wenn die Erklärung in einfachen Worten ist. Danke im Voraus.

  • Beachten Sie, dass # ist lediglich eine Präprozessorfunktion, keine C-Sprachfunktion.

    Benutzer395760

    28. September 2011 um 15:40 Uhr

  • Beziehen auf string-izing Token in diesem Link.

    – JRL

    28. September 2011 um 15:40 Uhr


  • +1 – das hätte mich auch überrascht, haha.

    – John Humphreys

    28. September 2011 um 15:42 Uhr

  • @w00te: guter Kommentar 😉

    – Ameisen

    28. September 2011 um 15:54 Uhr

  • Heute habe ich verstanden 😉 warum die erste Person, die antwortet, so viele Upvotes bekommt 😛

    – Ameisen

    28. September 2011 um 16:02 Uhr

Benutzer-Avatar
Laurio Burchall

Das Zeichen „#“ ist ein Stringizer – es verwandelt ein Symbol in einen String. Der Code wird

putchar(“putchar”[3]);

  • schnellste antwort die ich je gesehen habe 🙂

    – Ameisen

    28. September 2011 um 15:39 Uhr

  • Warten! putchar("putchar"[3]); ist das gültig? Bitte seien Sie klar, ich bin ein Anfänger in C! Was bewirkt das eigentlich?

    – Ameisen

    28. September 2011 um 15:41 Uhr


  • C-Basic-Strings sind Char-Arrays, “putchar” ist ein Array, in dem item[0]=’p’,Element[1]=’u’,Element[2]=’t’,Element[3]=’c’, etc…, deshalb “putchar”[3] ist ‘c’

    – Hernán Eche

    28. September 2011 um 15:53 ​​Uhr


  • @Ameise: "putchar"[3] ist gleich dem Zeichen bei Offset 3 (natürlich bei Null beginnend) in der Zeichenfolge (die nur ein Array von ist char), deshalb bekommst du "c".

    – Jon Purdy

    28. September 2011 um 15:54 Uhr

  • @Ant’s: Betrachten Sie eine assert(x) Makro, das den Ausdruck bestätigt x ist wahr, und druckt #x mit __LINE__ und scheitert sonst.

    – Jon Purdy

    28. September 2011 um 16:00 Uhr

Das Hash-Zeichen bedeutet “stringify”, also d(x) erweitert sich zu putchar("putchar"[3])woher die c.

Benutzer-Avatar
N / A

Aus hier:

Funktionsmakrodefinitionen akzeptieren zwei spezielle Operatoren (# und ##) in der Ersetzungssequenz: Wenn der Operator # verwendet wird, bevor ein Parameter in der Ersetzungssequenz verwendet wird, wird dieser Parameter durch ein Zeichenfolgenliteral ersetzt (als wäre er zwischen double Zitate)

#define str(x) #x
cout << str(test);

Einfach gesagt, es ändert den “x”-Parameter in einen String. In diesem Fall wird test zu einem char-Array, das ‘t’, ‘e’, ​​’s’, ‘t’, ‘\0’ enthält.

  • Genauer gesagt wird test zu „test“, einem Array aus fünf Zeichen, den vier Buchstaben plus dem Nullzeichen am Ende.

    – Derek Ledbetter

    28. September 2011 um 19:04 Uhr

Benutzer-Avatar
Konstantin

Das # ist ein Präprozessoroperator, der ein Literal in einen String umwandelt. Eigentlich deine d Makro druckt die vierte char der konvertierten Zeichenfolge Ihres Literals.

1123650cookie-checkWas ist das für ein Makro?

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

Privacy policy