');

C LanguageTipo qualificatori

Osservazioni

I qualificatori di tipo sono le parole chiave che descrivono una semantica aggiuntiva su un tipo. Sono parte integrante delle firme dei tipi. Possono apparire sia al livello più alto di una dichiarazione (che influisce direttamente sull'identificatore) sia a sottolivelli (rilevanti solo per i puntatori che influiscono sui valori puntati):

Parola chiave Osservazioni
const Impedisce la mutazione dell'oggetto dichiarato (apparendo al livello più alto) o impedisce la mutazione del valore puntato (apparendo accanto a un sottotipo di puntatore).
volatile Informa il compilatore che l'oggetto dichiarato (al livello più alto) o il valore puntato (nei sottotipi del puntatore) può cambiare il suo valore come risultato di condizioni esterne, non solo come risultato del flusso di controllo del programma.
restrict Un suggerimento per l'ottimizzazione, pertinente solo ai puntatori. Dichiara l'intento che per tutta la durata del puntatore, non verranno utilizzati altri puntatori per accedere allo stesso oggetto puntato.

L'ordinamento di tipo qualificatori rispetto a specificatori della classe di memorizzazione ( static , extern , auto , register ), tipo di modificatori ( signed , unsigned , short , long ) e specificatori di tipo ( int , char , double , ecc) non è applicata, ma la buona pratica è metterli nell'ordine di cui sopra:

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

Qualifiche di alto livello

/* "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;

Qualifiche del sottotipo di puntatore

/* "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;

Tipo qualificatori Esempi correlati