Cenni preliminari sulle dichiarazioni

Una "dichiarazione" consente di specificare l'interpretazione e gli attributi di un set di identificatori. Una dichiarazione che fa sì che l'archiviazione venga riservata anche per l'oggetto o la funzione denominata dall'identificatore viene chiamata "definizione". Le dichiarazioni C per variabili, funzioni e tipi hanno questa sintassi:

Sintassi

declaration:
declaration-specifiersattribute-seqOptareinit-declarator-listOptare;

/* attribute-seqopt è specifico di Microsoft */

declaration-specifiers:
storage-class-specifierdeclaration-specifiersOptare
type-specifierdeclaration-specifiersOptare
type-qualifierdeclaration-specifiersOptare

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init-declarator:
declarator
declarator = initializer

Nota

Questa sintassi per declaration non viene ripetuta nelle sezioni seguenti. La sintassi nelle sezioni seguenti di solita inizia con il non terminale declarator.

Le dichiarazioni in init-declarator-list contengono gli identificatori denominati. init È un'abbreviazione per l'inizializzatore. init-declarator-list è una sequenza delimitata da virgole di dichiaratori, ognuno dei quali può avere informazioni aggiuntive sul tipo o un inizializzatore o entrambi. declarator contiene gli eventuali identificatori dichiarati. Il declaration-specifiers valore non determiniale è costituito da una sequenza di identificatori di tipo e classe di archiviazione che indicano il collegamento, la durata dell'archiviazione e almeno parte del tipo delle entità indicate dai dichiaratori. Le dichiarazioni sono costituite da alcune combinazioni di identificatori della classe di archiviazione, identificatori di tipo, qualificatori di tipo, dichiaratori e inizializzatori.

Le dichiarazioni possono contenere uno o più attributi facoltativi elencati in attribute-seq. seq È un'abbreviazione per la sequenza. Questi attributi specifici di Microsoft eseguono diverse funzioni, descritte in dettaglio in questo libro.

Nella forma generale di una dichiarazione di variabile, type-specifier fornisce il tipo di dati della variabile. type-specifier può essere un composto, come quando il tipo viene modificato da const o volatile. declarator fornisce il nome della variabile, possibilmente modificato in modo da dichiarare un tipo di matrice o puntatore. Ad esempio,

int const *fp;

dichiara una variabile denominata fp come puntatore a un valore non modificabile (const). int È possibile definire più variabili in una dichiarazione usando più dichiaratori, separati da virgole.

Una dichiarazione deve avere almeno un dichiaratore oppure il relativo identificatore di tipi deve dichiarare un tag della struttura, un tag di unione o i membri di un'enumerazione. I dichiaratori forniscono le eventuali informazioni rimanenti su un identificatore. Un dichiaratore è un identificatore che può essere modificato con parentesi quadre ([ ]), asterischi (*) o parentesi ( ( ) ) per dichiarare rispettivamente una matrice, un puntatore o un tipo di funzione. Quando si dichiarano variabili semplici (ad esempio caratteri, integri ed elementi a virgola mobile) o strutture e unioni di variabili semplici, declarator è solo un identificatore. Per altre informazioni sui dichiaratori, vedere Dichiaratori e dichiarazioni di variabili.

Tutte le definizioni sono implicitamente dichiarazioni, ma non tutte le dichiarazioni sono definizioni. Ad esempio, le dichiarazioni di variabili che usano l'identificatore extern della classe di archiviazione sono "referencing", anziché dichiarazioni di "definizione". Se una variabile esterna deve essere definita prima della definizione o se è definita in un altro file di origine da quella in cui viene usata, è necessaria una extern dichiarazione. L'archiviazione non viene allocata da dichiarazioni di "riferimento", né può essere inizializzata nelle dichiarazioni.

Una classe o un tipo di archiviazione (o entrambi) è necessaria nelle dichiarazioni delle variabili. Fatta eccezione per __declspec, è consentito un solo identificatore di classi di archiviazione in una dichiarazione e non tutti gli identificatori di classi di archiviazione sono consentiti in ogni contesto. La __declspec classe di archiviazione è consentita con altri identificatori della classe di archiviazione ed è consentita più volte. L'identificatore di classi di archiviazione di una dichiarazione incide sulla modalità di archiviazione e inizializzazione dell'elemento dichiarato e su quali parti di un programma possono fare riferimento all'elemento.

I storage-class-specifier terminali definiti in C includono auto, extern, register, statice typedef. Microsoft C include anche il storage-class-specifier terminale __declspec. Tutti i storage-class-specifier terminali eccetto typedef e __declspec sono descritti in Classi di archiviazione. Per informazioni su typedef, vedere typedef Dichiarazioni. Per informazioni su __declspec, vedere Attributi di Storage-Class estesi.

La posizione della dichiarazione all'interno del programma di origine e la presenza o l'assenza di altre dichiarazioni della variabile sono fattori importanti nel determinare la durata delle variabili. Possono esserci più ridichiarazioni, ma una sola definizione. Tuttavia, una definizione può apparire in più unità di conversione. Per oggetti con collegamento interno, questa regola di applica separatamente a ogni unità di conversione, perché gli oggetti collegati internamente sono univoci di un'unità di conversione. Per gli oggetti con collegamenti esterni, questa regola si applica all'intero programma. Per altre informazioni sulla visibilità, vedere Durata, ambito, visibilità e collegamento.

Gli identificatori di tipi forniscono alcune informazioni sui tipi di dati degli identificatori. L'identificatore di tipi predefinito è int. Per altre informazioni, vedere Identificatori di tipi. Gli identificatori di tipi possono anche definire i tag del tipo, i nomi di componenti di struttura e unione e le costanti di enumerazione. Per altre informazioni, vedere Dichiarazioni di enumerazione, dichiarazioni di struttura e dichiarazioni di unione.

Sono disponibili due type-qualifier terminali: const e volatile. Questi qualificatori specificano proprietà aggiuntive di tipi rilevanti solo quando si accede a oggetti di tale tipo tramite l-values. Per altre informazioni su const e volatile, vedere Qualificatori di tipo. Per una definizione di l-value, vedere Espressioni L-Value e R-Value.

Vedi anche

Riepilogo della sintassi del linguaggio C
Dichiarazioni e tipi
Riepilogo delle dichiarazioni