Ich bin auf ein Stück Code gestoßen void *p = &&abc;
. Welche Bedeutung hat &&
hier? Ich kenne Rvalue-Referenzen, aber ich denke &&
in diesem Zusammenhang verwendet wird, ist anders. Was macht &&
eintragen void *p = &&abc;
?
Was bedeutet && in void *p = &&abc;
Brent Arien
Prasun Saurav
&&
ist die Erweiterung von gcc um die Adresse des Labels zu erhalten, das in der aktuellen Funktion definiert ist.
void *p = &&abc
ist im Standard C99 und C++ illegal.
Dies kompiliert mit g++.
-
Stellen Sie sich nun vor, wie besser Programmierer jeder wäre, wenn gcc standardmäßig -pedantic hätte. Dann würden die Leute C lernen, anstatt irrelevante Informationen über Gnus.
– Ludin
24. Mai 2011 um 6:40 Uhr
-
Was für ein Hack. Wenn sie eine neue Syntax für Label-Zeiger erfinden, sollten sie auch einen neuen Typ dafür erfinden, anstatt sie zu verwenden
void*
.– Markieren Sie Lösegeld
25. Mai 2011 um 17:05 Uhr
-
@Prasoon Saurav: Wer auch immer abgelehnt hat, missbilligt das Feature wahrscheinlich und lässt es an dir aus.
– Chuck
25. Mai 2011 um 23:20 Uhr
-
@Lundin: Dasselbe gilt für die meisten Compiler.
__forceinline
?__declspec(naked)
? Einer meiner Lieblings-MSVCisms ist:template<typename T> class X { friend T; }
was ungültiges C++03 ist.– Sebastian Mach
17. August 2012 um 8:20 Uhr
-
Der zweite Link ist tot.
– Coeur
8. Oktober 2018 um 16:06 Uhr
Flavius
So finden Sie es heraus
Das ist die Adresse eines Labels und es ist eine spezifische Funktion GCC.
int main(void) {
void* startp;
s:
startp = &&s;
printf("the assignment above starts at address %p\n", startp);
return 0;
}
Du hättest es selbst herausfinden können, indem du es getestet hast:
int main(void) {
void* startp;
int a;
startp = &&a;
printf("startp=%p\n", startp);
return 0;
}
In diesem Fall sagt GCC:
Fehler: Label ‘a’ verwendet, aber nicht definiert
Unter der Haube – Montage
Sie müssen Assembler beherrschen, um das wirklich zu verstehen, aber ich werde versuchen, Ihnen zu erklären, was eine Adresse eines Labels bedeutet.
Nachdem das Betriebssystem die .exe-Datei von der Festplatte geladen hat, wird eine Komponente des Betriebssystems namens „The Loader“ (Windows hat den „PE Loader“, Linux hat den „ELF Loader“ oder vielleicht sogar andere, wenn sie darin kompiliert sind Kernel), führt es eine “Virtualisierung” dieses Programms durch und verwandelt es in einen Prozess.
Dieser Prozess hält sich für den einzigen im RAM und hat Zugriff auf den gesamten RAM (also 0x00000000-0xFFFFFFFF auf einem 32-Bit-Rechner).
(Das Obige ist nur ein kurzer Überblick über das, was passiert, Sie müssen wirklich das Zusammenbauen lernen, um es vollständig zu verstehen, also haben Sie Geduld mit mir)
Nun, das Label in einem Quellcode ist im Grunde eine Adresse. “Gehe zu Label;” macht nichts anderes als einen Sprung zu dieser Adresse (denken Sie an die Befehlszeiger im Zusammenbau). Dieses Etikett speichert diese RAM-Adresse, und so können Sie diese Adresse herausfinden.
Nachdem Sie ASM gelernt haben, werden Sie feststellen, dass diese Adresse auf eine Anweisung innerhalb der verweist .text
Abschnitt der ausführbaren Datei. Das .text
Abschnitt ist derjenige, der den (binären) Code Ihres Programms enthält, der ausgeführt werden soll.
Sie können dies überprüfen mit:
objdump -x a.out
Ein praktisches Beispiel
Wie beschrieben in GCC, können Sie damit eine Sprungtabelle initialisieren. Etwas Scanner-Generatoren wie re2c (siehe die -g
Parameter) verwenden, um kompaktere Scanner zu generieren. Vielleicht gibt es sogar eine Parser-Generator mit der gleichen Technik.
-
Kompilieren Sie mit -std=c99 -pedantic.
– Ludin
24. Mai 2011 um 6:41 Uhr
-
Es ist ziemlich wichtig zu erwähnen, dass es sich um eine GCC-Erweiterung handelt und nicht um einen Kernbestandteil der Sprache
– jalf
24. Mai 2011 um 7:19 Uhr
-
Das ist ziemlich beeindruckend Flavius.
– Octavian Damian
24. Mai 2011 um 8:25 Uhr
-
Ich mag diese Art von Antwort, mehr Menschen müssen gelehrt werden, wie man Antworten findet, anstatt nur gesagt zu werden.
– Lass uns Mittagessen
21. Juni 2011 um 19:54 Uhr
-
Danke für die ausführliche Erklärung. Schätzte die montagebezogene Analyse.
– CᴴᴀZ
15. November 2013 um 5:43 Uhr
Wo hast du das gesehen?
– Benutzer541686
24. Mai 2011 um 6:29 Uhr
Ich würde auch gerne wissen, wo du das gesehen hast.
– Flavius
24. Mai 2011 um 7:35 Uhr