2010-10-26 14 views
10
const struct sockaddr FAR* name, 
+2

Das heißt, ich habe Bill Gates in der Warteschleife und er will mit dir darüber reden, dass er seine "640k wird für jeden reichen" zurück aus den 1980er Jahren. –

Antwort

17

Es ist eine alte Erweiterung aus der Ära der segmentierten Speicherarchitekturen. Es bedeutet im Grunde "das ist ein Zeiger, der in der Lage sein muss, auf jede Adresse zu zeigen, nicht nur auf Dinge im gleichen Segment wie der Code, der sie verwendet".

Siehe mehr oder auf wikipedia page.

+0

So ist es heute nutzlos? – ollydbg

+2

ziemlich viel, es sei denn, Sie müssen 16-Bit-Code aus irgendeinem witzigen Grund schreiben (was wirklich wirklich wirklich sehr selten ist). Nutzlos für normale Leute. – TomTom

+1

Auf einigen anderen Plattformen kann naher und entfernter Zeiger erscheinen (nicht genau mit derselben Bedeutung), wenn Sie also Crosscompiling durchführen, können Sie damit umgehen. – Vovanium

4

far bedeutet nichts in C. Überprüfen Sie die C99 standard [PDF] und sehen Sie, ob Sie erwähnen können, weit Zeiger. Far-Zeiger waren eine Erweiterung, die Compilern hinzugefügt wurde, die auf die Architekturen 8086/80286 abzielten, um Unterstützung für das segmentierte Speichermodell bereitzustellen.

2

Wenn nichts ist, wenn Sie zufällig einen 16-Bit-x86-Compiler verwenden.

Wenn Sie in den Win32-Header WinDef.h (in Visual Studio, klicken Sie einfach mit der rechten Maustaste auf das Wort FAR in der Quelle und wählen Sie "Go to Definition", Sie sehen, dass es ein Makro als far definiert ist, die wiederum ist auch ein Makro als gar nichts definiert!

Es ist nur dort, um die Kompilierung von Legacy-Win16-Quelle als Win32 zu ermöglichen.In 16-Bit-x86-Compiler war far ein Compiler-Erweiterung Schlüsselwort zur Unterstützung seg :: Offset-Zeiger die zu einer 20-Bit-Adresse aufgelöst werden (16-Bit-x86 hatte nur einen 1-Mb-Adressraum!) Sie unterscheiden sich von 16-Bit-near-Zeigern, die nur den :: Offset vom aktuellen Segment umfassten

+4

Mehrere andere Plattformen haben auch Nah- und Fernzeiger. AVR zum Beispiel. – Vovanium

+1

@Vovanium: Können Sie ein Zitat zur Verfügung stellen? Der GNU AVR Compiler unterstützt sicherlich keine "fernen" oder "nahen" Keywords. Der GNU-Compiler für Toshibas MeP hat jedoch "nah" und "weit", aber nicht aus demselben architektonischen Grund wie der x86 Real Mode. Also ja, einige Architekturen benötigen immer noch Erweiterungen, um verschiedene Speicherbereiche zu adressieren; nicht nur "nah" und "weit". Harvard-Architekturen und DSPs erfordern normalerweise Erweiterungen. – Clifford

+1

IAR haben winzige, nahe, weit und riesig Speicher-Spezifizierer (siehe http://supp.iar.com/FilesPublic/SUPPORT/000373/memoryusage.pdf) Und ja, Zeiger Größe Spezifizierer möglicherweise nicht die gleichen wie x86 Einsen. – Vovanium