#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.
Heute habe ich verstanden 😉 warum die erste Person, die antwortet, so viele Upvotes bekommt 😛
– Ameisen
28. September 2011 um 16:02 Uhr
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.
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
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.
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