Cenni preliminari sulle dichiarazioni
Una "dichiarazione" consente di specificare l'interpretazione e gli attributi di un set di identificatori. Una dichiarazione che determina anche la riserva dell'archiviazione per l'oggetto o la funzione denominata dall'identificatore è detta "definizione". Le dichiarazioni C per variabili, funzioni e tipi hanno questa sintassi:
Sintassi
declaration
:
declaration-specifiers
attribute-seq
opt opt opt init-declarator-list
;
/* attribute-seq
opt è specifico di Microsoft */
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
optare
type-specifier
declaration-specifiers
optare
type-qualifier
declaration-specifiers
optare
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
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 di 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
di classe di archiviazione sono "riferimenti", anziché dichiarazioni di "definizione". Se è necessario fare riferimento a una variabile esterna prima della definizione o se è definita in un altro file di origine da quello in cui viene usato, è necessaria una extern
dichiarazione. L'archiviazione non viene allocata dalle 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 di 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
, register
extern
, , static
e typedef
. Microsoft C include anche il storage-class-specifier
terminale __declspec
. Tutti i storage-class-specifier
terminali tranne typedef
e __declspec
sono descritti in Classi di archiviazione. Per informazioni su typedef
, vedere typedef
Dichiarazioni. Per informazioni su __declspec
, vedere Attributi della classe di archiviazione estesa.
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.
Esistono 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 di sintassi del linguaggio C
Dichiarazioni e tipi
Riepilogo delle dichiarazioni