Explicador de declaradores C

Siga la asociación de punteros, arrays, funciones y calificadores en una declaración C11/C17 admitida.

Acerca de esta herramienta

Introduzca una declaración y elija Explicar. Se permiten saltos de línea dentro de esa declaración; el punto y coma final es opcional. Los ejemplos rellenan la entrada sin evaluarla. Lea los pasos numerados desde el nombre declarado hacia fuera hasta el tipo base. La sección Tokens muestra los tokens de entrada individuales. Editar la entrada borra la explicación anterior.

Sin paréntesis de agrupación, los sufijos de array y función se asocian antes que los prefijos de puntero. Así int *a[3]; declara un array de tres punteros a int, mientras que int (*a)[3]; declara un puntero a un array de tres int. int *(*fp)(void); declara un puntero a una función sin parámetros que devuelve un puntero a int.

El subconjunto admitido usa reglas C11/C17: tipos base integrados con combinaciones válidas de signed, unsigned, short y long; const y volatile en el tipo base o en punteros individuales; paréntesis anidados; tamaños de array decimales positivos sin ceros iniciales; y declaradores de función. Las declaraciones de parámetros pueden contener un tipo base, punteros y un nombre opcional. Los identificadores usan letras ASCII, dígitos y guiones bajos y no pueden empezar por un dígito. Comentarios y directivas del preprocesador quedan fuera de este subconjunto. Los calificadores pertenecen a su propio nivel de tipo: const int *p; apunta a const int, mientras que int *const p; hace que el propio puntero esté calificado const.

En C11/C17, f() deja sin especificar el número y los tipos de parámetros. f(void) declara explícitamente que no hay parámetros. Esta herramienta no usa el significado C23 de los paréntesis vacíos. Los arrays no pueden tener tipos de elemento función o incompletos; las funciones no pueden devolver directamente arrays ni funciones. Un puntero puede conectar estos tipos, como una función que devuelve un puntero a un array.

Fuera de este subconjunto: nombres typedef, estructuras, uniones, enums, inicializadores, declaraciones múltiples, especificadores de clase de almacenamiento, atributos, _Atomic, restrict, argumentos variables, parámetros array o función, arrays de longitud variable y expresiones de tamaño de array. Una sintaxis no admitida no afirma que la declaración sea inválida en todos los programas C. Es un explicador de declaradores, no un compilador ni una comprobación de una unidad de traducción entera.

Límites de entrada: 8192 caracteres, 512 tokens, profundidad de anidación 64, 64 capas de tipo derivado, 64 parámetros, identificadores de hasta 128 caracteres y tamaños de array de hasta 20 dígitos. Los arrays se describen de forma simbólica; no se reserva almacenamiento ni se calcula el tamaño en bytes.

Fuentes: WG14 N1570, C11 draft, sections 6.7.2, 6.7.3 and 6.7.6; WG14 N3096, C23 draft, section 6.7.6.3, for the changed meaning of ().