2012-02-04 17 views
14

estructuras anónimas se han añadido en la norma C11, por loC11 anonymous structs via typedefs?

typedef struct { 
    struct {int a, b}; 
    int c; 
} abc_struct; 

es válida y estándar. ¿Está también dentro del estándar usar un typedef en lugar de la declaración struct completa? Ej .:

typedef struct { 
    int a, b; 
} ab_struct; 

typedef struct { 
    ab_struct; 
    int c; 
} abc_struct; 

La documentación de GCC dice que esta es una extensión de Plan 9, pero entonces se trabaja en las unos compiladores que he probado (incluyendo GCC ...). Al leer el estándar en sí, , creo que está bien, pero este es el tipo de lectura cercana que es fácil de arruinar.

Respuesta

9

Aparentemente, Joseph S. Myers, del equipo gcc, formuló una pregunta al comité C al respecto. Y la respuesta es no, no es válido en C11.

ver la respuesta aquí:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1549.pdf

Y el comentario de Myers:

reunión de Londres WG14 de esta semana acordaron no permitir el uso de typedef en la declaración de la estructura y la unión campos anónimos, según N1549.

fuente http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01151.html

La pregunta fue hecha en SC22WG15.12205 ver 5,28 SC22WG14.12205, Estructuras Anónimos (N1425) en http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf

0

Bueno, me temo que no he tomado la molestia de conseguir el estándar terminado todavía, pero esto es lo que el borrador final dice:

  • Un miembro no identificado, cuyo tipo especificador es un especificador de estructura sin etiqueta es llamado una estructura anónima; un miembro sin nombre cuyo tipo especificador es un especificador de unión sin etiqueta se llama unión anónima.

Solo puedo interpretar el hecho de que solo struct {}; y union {}; pueden ser una estructura/unión anónima.

4

En realidad su segundo fragmento está lleno de peligros y no es equivalente al primero sin especificar explícitamente -fplan9-extensions en gcc.

En particular ab_struct; la declaración en la línea 6 no hace NADA (según la advertencia de gcc). Sólo pegar su segundo fragmento en foo.c genera:

foo.c:6: warning: declaration does not declare anything 

y en particular si se va a tratar:

typedef struct { 
    int a, b; 
} ab_struct; 

typedef struct { 
    ab_struct; 
    int c; 
} abc_struct; 


int main() { 
    abc_struct abc; 
    abc.a = 5; 
    return 0; 
} 

que se obtiene un error de sintaxis en la línea 13 abc.a = 5; sin la -fplan9-extensio.

Mientras usa el fragmento superior, su estructura anónima funcionará como usted cree que debería.A saber:

typedef struct { 
    struct { 
      int a, b; 
    }; 
     int c; 
} abc_struct; 


int main() { 
    abc_struct abc; 
    abc.a = 5; 
    return 0; 
}