C LanguageCalificadores de tipo


Observaciones

Los calificadores de tipo son las palabras clave que describen semánticas adicionales sobre un tipo. Son una parte integral de las firmas de tipo. Pueden aparecer tanto en el nivel superior de una declaración (que afecta directamente al identificador) como en los subniveles (relevantes solo para los indicadores, que afectan los valores apuntados a):

Palabra clave Observaciones
const Evita la mutación del objeto declarado (al aparecer en el nivel superior) o evita la mutación del valor apuntado (al lado de un subtipo de puntero).
volatile Informa al compilador que el objeto declarado (en el nivel superior) o el valor apuntado (en los subtipos de puntero) pueden cambiar su valor como resultado de condiciones externas, no solo como resultado del flujo de control del programa.
restrict Una sugerencia de optimización, relevante solo para los punteros. Declara la intención de que durante la vida útil del puntero, no se utilizarán otros punteros para acceder al mismo objeto apuntado.

El ordenamiento de los calificadores de tipo con respecto a los especificadores de clase de almacenamiento ( static , extern , auto , register ), modificadores de tipo (con signed , unsigned , short , long ) y los especificadores de tipo ( int , char , double , etc.) no se aplica, pero La buena práctica es ponerlos en el orden mencionado:

static const volatile unsigned long int a = 5; /* good practice */
unsigned volatile long static int const b = 5; /* bad practice */

Cualificaciones de primer nivel

/* "a" cannot be mutated by the program but can change as a result of external conditions */
const volatile int a = 5;

/* the const applies to array elements, i.e. "a[0]" cannot be mutated */    
const int arr[] = { 1, 2, 3 };

/* for the lifetime of "ptr", no other pointer could point to the same "int" object */
int *restrict ptr;

Cualificaciones de subtipo de puntero

/* "s1" can be mutated, but "*s1" cannot */
const char *s1 = "Hello";

/* neither "s2" (because of top-level const) nor "*s2" can be mutated */
const char *const s2 = "World";

/* "*p" may change its value as a result of external conditions, "**p" and "p" cannot */
char *volatile *p;

/* "q", "*q" and "**q" may change their values as a result of external conditions */
volatile char *volatile *volatile q;

Calificadores de tipo Ejemplos relacionados