Erfahren Sie, wie Sie den `error C2100: illegal indirection` in Visual Studio 2008 beheben, indem Sie Zeiger und Funktionsreferenzen in C korrekt behandeln.
---
Dieses Video basiert auf der Frage https://stackoverflow.com/q/203058/ gestellt von dem Nutzer 'David Arno' ( https://stackoverflow.com/u/7122/ ) sowie auf der Antwort https://stackoverflow.com/a/203111/ bereitgestellt von dem Nutzer 'Tony Lee' ( https://stackoverflow.com/u/5819/ ) auf der Website 'Stack Overflow'. Vielen Dank an diese großartigen Nutzer und die Stackexchange-Community für ihre Beiträge.
Besuchen Sie diese Links, um den Originalinhalt und weitere Details zu sehen, z. B. alternative Lösungen, aktuelle Entwicklungen zum Thema, Kommentare, Versionsverlauf usw. Der ursprüngliche Titel der Frage lautete beispielsweise: How can I overcome the "error C2100: illegal indirection" when accessing the contents of a void* in VS2008
Außerdem steht der Inhalt (außer Musik) unter der Lizenz CC BY-SA https://meta.stackexchange.com/help/l...
Der ursprüngliche Fragenbeitrag steht unter der Lizenz 'CC BY-SA 2.5' ( https://creativecommons.org/licenses/... ), und der ursprüngliche Antwortbeitrag steht unter der Lizenz 'CC BY-SA 2.5' ( https://creativecommons.org/licenses/... ).
Falls Ihnen irgendetwas auffällt oder Unstimmigkeiten bestehen, schreiben Sie mir bitte an vlogize [AT] gmail [DOT] com.
---
Wie man den error C2100: illegal indirection in VS2008 überwindet
Wenn Sie eine C-Anwendung in Visual Studio 2008 entwickeln, können Ihnen verschiedene Warnungen und Fehlermeldungen begegnen, die frustrierend sein können. Eine davon ist der error C2100: illegal indirection, der häufig auftritt, wenn versucht wird, Funktionszeiger zu manipulieren, insbesondere wenn ein void* verwendet wird. In diesem Beitrag erfahren Sie, wie Sie diesen Fehler verstehen und eine klarere, effizientere Lösung anwenden.
Verständnis des Problems
Das Problem entsteht typischerweise, wenn Sie versuchen, einen void* Zeiger zu dereferenzieren. Ein void* ist ein generischer Zeigertyp in C, der nicht auf einen spezifischen Datentyp zeigt. Daher führt das Dereferenzieren eines void* Zeigers für den Compiler zur Verwirrung und resultiert im Fehler „illegal indirection“.
Zum Beispiel sorgt folgendes Codestück für diesen Fehler:
[[Siehe Video, um diesen Text oder Codeausschnitt anzuzeigen]]
Analyse des Fehlers
Im obigen Code:
Versuchen Sie, einen void* Zeiger (ptr) zu erstellen, der auf die Funktion GetVersion in der Struktur env zeigt.
Wenn Sie versuchen, ptr zu dereferenzieren und eine neue Funktionsadresse zuzuweisen, weiß der Compiler nicht, wie er die Indirektion handhaben soll, da ptr vom Typ void ist.
Die Lösung
Die gute Nachricht ist, dass es bessere Ansätze gibt, mit Funktionszeigern in Ihrer C-Anwendung umzugehen. Hier gliedern wir die Lösung in klare und organisierte Abschnitte.
1. Verwendung eines Zeigers auf einen Zeiger
Sie können den Fehler der illegalen Indirektion beheben, indem Sie einen Zeiger auf einen Zeiger des passenden Funktionstyps verwenden. Ändern Sie Ihren Code wie folgt:
[[Siehe Video, um diesen Text oder Codeausschnitt anzuzeigen]]
Erklärung:
Hier wird ptr als Zeiger auf einen Zeiger von void* deklariert, was dem Datentyp entspricht, den Sie manipulieren möchten.
Dieses Cast ermöglicht es Ihnen, ptr erfolgreich zu dereferenzieren, ohne einen Compilerfehler auszulösen.
2. Deklaration von Funktionszeigertypen
Eine typensichere und klarere Methode ist, im Typsystem zu arbeiten, indem Sie Funktionszeigertypen explizit deklarieren. So können Sie es machen:
[[Siehe Video, um diesen Text oder Codeausschnitt anzuzeigen]]
Erklärung:
typedef int (*fncPtr)(void); definiert einen neuen Typ fncPtr, der ein Zeiger auf eine Funktion ist, die einen int zurückgibt und keine Parameter erwartet.
Die Variable ptr wird dann als Zeiger auf einen Funktionszeiger deklariert, sodass Sie sicher eine neue Funktion (wie NewFunction) zuweisen können.
3. Sicherstellung der plattformübergreifenden Kompatibilität
Eine häufig geäußerte Sorge ist, ob die Verwendung von int- oder long-Zeigern zu Kompatibilitätsproblemen zwischen 32-Bit- und 64-Bit-Systemen führen könnte. Durch die Verwendung von Funktionszeigertypen, wie oben gezeigt, vermeiden Sie diese Probleme, was zu saubererem, sichererem und wartungsfreundlicherem Code führt.
Zusammenfassung
Zusammenfassend gilt: Wenn Sie den error C2100: illegal indirection in Visual Studio 2008 beim Arbeiten mit Funktionszeigern erhalten, beachten Sie folgende wichtige Punkte:
Vermeiden Sie die Verwendung von void* für Funktionszeiger, um Indirektionsprobleme zu verhindern.
Verwenden Sie entweder einen Zeiger-auf-Zeiger-Ansatz oder deklarieren Sie Funktionszeigertypen explizit für mehr Klarheit und Sicherheit.
Stellen Sie sicher, dass Ihr Code auf verschiedenen Plattformarchitekturen kompatibel bleibt, indem Sie die richtigen Typen verwenden.
Wenn Sie diese Vorschläge befolgen, können Sie den Fehle
Информация по комментариям в разработке