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

Significa que tengo a Bill Gates en espera y él quiere hablar contigo sobre que su "640k será suficiente para cualquier persona" en los años ochenta. –

Respuesta

17

Es una antigua extensión de la era de las arquitecturas de memoria segmentadas. Básicamente significa que "este es un puntero que debe poder apuntar a cualquier dirección, no solo a las cosas del mismo segmento que el código que lo usa".

Ver más o en el wikipedia page.

+0

¿Entonces es inútil hoy? – ollydbg

+2

prácticamente, a menos que NECESITES escribir código de 16 bits por algún motivo curioso (que en realidad es realmente muy raro). Inútil para personas normales. – TomTom

+1

En algunas otras plataformas, pueden aparecer punteros cercanos y lejanos (no exactamente con el mismo significado), por lo que si realiza una compilación cruzada, puede tener que lidiar con ella. – Vovanium

4

far no significa nada en C. Consulte el C99 standard [PDF] y vea si puede encontrar una mención de los punteros lejanos. Los puntos lejanos fueron una extensión añadida a los compiladores que apuntan a las arquitecturas 8086/80286 para proporcionar soporte para el modelo de memoria segmentada.

2

Si nada a menos que esté usando un compilador x86 de 16 bits.

Si mira en el encabezado Win32 WinDef.h (en Visual Studio, simplemente haga clic derecho en la palabra FAR en el origen y seleccione "Ir a definición", verá que es una macro definida como far, que a su vez también es una macro definida como nada!

Está solo allí para permitir la compilación de la fuente Win16 heredada como Win32. En compiladores x86 de 16 bits, far era una palabra clave de extensión del compilador para admitir punteros seg :: offset que resuelven a una dirección de 20 bits (¡16 bit x86 solo tenía un espacio de direcciones de 1Mb!). Son distintos de los punteros de 16 bit near que solo comprendían el desplazamiento :: del segmento actual.

+4

Varias otras plataformas también tienen punteros cercanos y lejanos. AVR por ejemplo. – Vovanium

+1

@Vovanium: ¿Puede proporcionar una citación? El compilador GNU AVR ciertamente no admite las palabras clave 'far' o' near'. El compilador de GNU para el MeP de Toshiba tiene 'near' y' far' sin embargo, pero no por el mismo motivo arquitectónico que el modo real x86. Entonces, sí, algunas arquitecturas aún requieren extensiones para abordar diferentes espacios de memoria; no solo 'cerca' y' lejos'. Las arquitecturas y DSP de Harvard suelen requerir extensiones. – Clifford

+1

IAR tiene especificadores de almacenamiento pequeños, cercanos, lejanos y grandes (mira http://supp.iar.com/FilesPublic/SUPPORT/000373/memoryusage.pdf) Y sí, los especificadores de tamaño de puntero pueden no ser los mismos que los x86. – Vovanium