2010-08-29 8 views
5

Estoy revisando el código de la versión 6 de Unix con el libro del León. Uno de los archivos de cabecera (param.h, se puede acceder here) define las siguientes estructuras:Struct que aparentemente no define instancias en Unix v6

/*struct to access integers*/ 

/*single integer */ 
struct { int integ; }; 

/*in bytes*/ 
struct { char lobyte; char hibyte; }; 

no parecen Estas estructuras para definir cualquier instancia, ni son nombrados para que puedan ser utilizados posteriormente. ¿Alguien sabe cuál es su uso?

Gracias

+0

¿Tiene el código fuente completo? ¿Podrías analizar si estas cosas alguna vez se usan? (Podría ser un poco difícil de grep, pero podrías intentar encontrar archivos que incluyan ese encabezado y luego usar algo llamado "lobyte", o algo así ...) –

Respuesta

5

Si alguien incluido todo el archivo en una declaración de la Unión, que les permitan acceder a las diferentes partes.

Sería algo así como:


    union{ 
    #include <param.h> 
    } myparam; 

    myparam.integ = 0xDEAD; 
    assert(myparam.lobyte == 0xAD) 
    assert(myparam.hibyte == 0xDE) 

(Depende de la orden de bits de la arquitectura ...)

Así que después de haber mirado un poco, parece que en las versiones antiguas de C, que wouldn' t han tenido que declarar la unión; solo había un espacio de nombres para todos los miembros de struct/union que acaba de traducirse en un desplazamiento de bytes que puede usar en cualquier variable. La mejor mención de esto que pude encontrar está aquí: http://docs.sun.com/source/806-3567/compat.html Describiendo pre-ISO Sun C:

Permite que los tipos de estructura, unión y aritmética utilizando operadores de selección de miembros ('.', '->') funcionen en miembros de otra estructura (s) o uniones.

+0

¿Es solo yo o es una forma extremadamente complicada de hacer ¿eso? Dudo que esto sea para lo que fue diseñado. Sin embargo, lo elogio por encontrar una forma de hacer que el código realmente haga algo útil. –

+0

Debo admitir que no estoy seguro. He visto algunos trucos horribles de unión/estructura/inclusión en el antiguo código C. No parecía tan raro cuando venías de la asamblea: las estructuras y los sindicatos a menudo se pensaban como una descripción del diseño de la memoria, en lugar de una declaración de tipo. – rjw

+0

parece ser usado como si fuera una unión pero sin declararlo específicamente. Entonces, por ejemplo, si hay un número entero, verá cosas como myint.lobyte. param.h incluye muchas otras constantes que significan que incluirlo dentro de una unión probablemente no funcionaría.Probablemente tenga algo que ver con el antiguo C – theprole

1

En aquellos días, los miembros de estructuras compartían todos el mismo espacio de nombre, no un espacio de nombres por estructura. En consecuencia, cada elemento de una estructura tenía que tener un nombre único en todas las estructuras, o el mismo elemento tenía que aparecer con el mismo tipo en el mismo desplazamiento en cada estructura en la que aparecía. Muy bien cómo que se utilizó con estos, no estoy seguro, pero sospecho que podría hacer:

int x; 

x.lobyte = 1; 
x.hibyte = 2; 

O algo similar a eso.

Ver también:

(Ninguno de los que parece responder a esta pregunta, sin embargo.)

Cuestiones relacionadas