Was bedeutet && in void *p = &&abc;

Lesezeit: 3 Minuten

Benutzeravatar von Brent Arias
Brent Arien

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; ?

  • 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

Benutzeravatar von Prasoon Saurav
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

Benutzeravatar von Flavius
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

1421360cookie-checkWas bedeutet && in void *p = &&abc;

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

Privacy policy