c++ c language-lawyer typedef storage-class-specifier

c++ - ¿Podemos colocar el especificador "typedef" en cualquier parte de la declaración?



language-lawyer storage-class-specifier (2)

Esto es de hecho permitido por el estándar C. typedef es un especificador de clase de almacenamiento y si observa la gramática dada en el estándar C (N1570, último borrador para C11, §6.7 p1 ):

Sintaxis
declaración:
. declaración-especificadores init-declarator-list (opt);
. static_assert-declaraciones
declaración-especificadores:
. especificación-clase-especificador-especificación de almacenamiento (opt)
. especificador de tipo declaración-especificadores (opt)
. Especificadores de declaración de calificador de tipo (opt)
. especificador de función declaración-especificadores (opt)
. especificación de alineación declaración-especificadores (opt)
init-declarator-list:
. declarador de inicio
. init-declarator-list, init-declarator
declarador de inicio
. declarador
. declarador = inicializador

El especificador de clase de almacenamiento puede aparecer después de otros especificadores de declaración, como el especificador de tipo .

Pero no debería usarlo , es obsoleto, vea §6.11.5 :

La colocación de un especificador de clase de almacenamiento que no sea al principio de los especificadores de declaración en una declaración es una característica obsoleta.

Esta pregunta ya tiene una respuesta aquí:

La sintaxis del especificador typedef :

typedef <existing_name> <alias_name>

por ejemplo:

typedef long unsigned int Int;

Está funcionando bien.

Pero, si typedef en cualquier parte de la declaración, así:

long unsigned typedef int Int;

Entonces, también está funcionando bien.

¿Por qué? ¿Podemos colocar typedef en cualquier parte de la declaración?


En primer lugar , citando de §6.11.5, "Direcciones de idioma futuras"

1 La colocación de un especificador de clase de almacenamiento que no sea al principio de los especificadores de declaración en una declaración es una característica obsoleta.

Por lo tanto, no confíe en esto, ya que puede eliminarse en el futuro.

Dicho esto, para comprender por qué funciona esto, consulte el estándar C11, capítulo §6.7.2:

[...] los especificadores de tipo pueden aparecer en cualquier orden, posiblemente entremezclados con los otros especificadores de declaración.

Por §6.7.1, sabemos que typedef es un especificador de clase de almacenamiento (un tipo particular de especificador de declaración), por lo que puede colocarse después (o antes) del especificador de tipo ( es decir , se puede mezclar). No cambia nada.