2012-05-20 20 views
5

Me preguntaba acerca de lo siguiente: ¿el nuevo _Alignas alineación especificador en C11 se aplica a miembros de estructura?Alineación de miembro de estructura con _Alignas

Siempre he asumido que mucho, pero la lectura completa del proyecto de público N1570 parece indicar que un alineación especificador no puede aparecen en un especificador-calificador lista, que es donde I' d esperar que sea , si fuera compatible. He leído la gramática un par de veces pero no puedo encontrar la manera _Alignas se supone que es permitido en una declaración miembro de estructura.

Sin embargo, me parece que la intención de la norma es que _Alignas debería ser aplicable a estructurar los miembros ya que el párrafo en _Alignas (§ 6.7.5) afirma que "un atributo de alineación no deberá ser especificado en una declaración de [...] un campo de bits ". Dado que el término "campo de bits" se define en § 6.7.2.1 para ser un miembro de estructura (redacción precisa: "tal miembro se llama campo de bits "), siempre he interpretado esa oración los especificadores de alineación implícitamente se permitieron para miembros de campo no de bit.

Comprobación contra implementaciones existentes muestra que tanto Clang 3,0 y GCC 4.7 apoyo _Alignas en miembros de la estructura sin queja (con -pedantic). El código fuente Clang reproduce el misma gramática de N1570, excepto Parser::ParseSpecifierQualifierList permite especificadores de alineación; la función contiene un elemento de TODO, embargo, que lee:

/// TODO: diagnose attribute-specifiers and alignment-specifiers. 

El código analizador GCC C parece ser similar, es decir, a pesar de que cita la gramática estándar, permite especificadores de alineación en especificador-calificador liza.

He comprobado también la lista de defectos conocidos, así como comp.lang.c y comp.std.c, para ver si el tema se había planteado allí, pero no parece ser el caso. Por lo tanto, mi pregunta: ¿se supone que los especificadores de alineación están permitidos en los miembros de la estructura?

EDIT: Las reglas gramaticales relevantes son:

// Compare this... 
(6.7) declaration-specifiers: 
      storage-class-specifier declaration-specifiers_opt 
      type-specifier declaration-specifiers_opt 
      type-qualifier declaration-specifiers_opt 
      function-specifier declaration-specifiers_opt 
      // This seems to be the only place that mentions 
      // alignment-specifier on the rhs of a rule. 
      alignment-specifier declaration-specifiers_opt 

(6.7.2.1) struct-or-union-specifier: 
      struct-or-union identifier_opt { struct-declaration-list } 
      struct-or-union identifier 

(6.7.2.1) struct-declaration-list: 
      struct-declaration 
      struct-declaration-list struct-declaration 

(6.7.2.1) struct-declaration: 
      specifier-qualifier-list struct-declarator-list_opt ; 
      static_assert-declaration 

// ...to this. 
(6.7.2.1) specifier-qualifier-list: 
      type-specifier specifier-qualifier-list_opt 
      type-qualifier specifier-qualifier-list_opt 
      // Missing alignment-specifier specifier-qualifier-list_opt? 

(6.7.5) alignment-specifier: 
      _Alignas (type-name) 
      _Alignas (constant-expression) 

Respuesta

5

Sección 6.7.5, p 6, especifica claramente que esto también se refiere a la alineación de los miembros

El requisito de alineación del objeto declarado o miembro se toma a sea la alineación especificada.

Así que la semántica prevista es esa. Si, como dices, la especificación formal de la gramática falla ese bit (no lo verifiqué), esto es un defecto, y debes informarlo.

Editar: Mirando la gramática, me parece que una adición de alignment-specifier en 6.7.2.1 falta en los casos de specifier-qualifier-list, y también que una explicación textual en el párrafo 14 estaría en orden.

+0

Veo --- Extrañé ese bit (o tal vez lo releí muchas veces que de alguna manera se coló cuando finalmente lo publiqué en SO); también entendí que tenía la intención de aplicar a los miembros. Pero luego comencé a revisar Clang y GCC y me confundí. Si tiene tiempo, ¿podría echarle un vistazo a la gramática? También podría haberme perdido algo ... (ya que extrañé el pasaje que estás citando, lo que hace que la intención sea bastante clara) Gracias. – rz0

+0

@ rz0, por favor vea mi edición. –

+0

Así que no era solo porque veía cosas ... Gracias por tomarse el tiempo para ver el problema. Acerca de informar un defecto, AFAIK el comité estándar es un cuerpo bastante hermético y un poco intimidante para un tipo al azar en Internet como yo. Pero si el error es real, estoy seguro de que alguien importante lo notará tarde o temprano, comenzando con los diversos implementadores. :) (El TODO en el código Clang parece indicar que al menos alguien notó la ausencia de 'alignment-specifier' en' specifier-qualifier-list'.) – rz0

Cuestiones relacionadas