2014-11-19 19 views
7

vedo domande occasionali quali "qual è la differenza tra una dichiarazione e una definizione":Perché una dichiarazione typedef non è chiamata definizione typedef?

What is the difference between a definition and a declaration? La distinzione è importante e intellettualmente raggiunge due cose importanti:

  1. che porta alla ribalta il differenza tra riferimento e referente
  2. È come C consente la separazione nel tempo dell'attaccamento tra riferimento e referente.

Quindi perché una dichiarazione C typedef non è denominata typedef definizione?

In primo luogo, è ovviamente una definizione. Definisce un alias. Il nuovo nome deve essere considerato come riferito alla cosa esistente. Ma certamente vincola il riferimento a un referente specifico ed è senza dubbio una dichiarazione che definisce.

In secondo luogo, non si chiamerebbe typedec se fosse una dichiarazione?

In terzo luogo, non eviterebbe tutte quelle domande confuse che le persone chiedono quando tentano di fare una dichiarazione in avanti usando un typedef?

+5

Sei pronto ad accettare la possibilità che la risposta sia semplice come "lo standard non è coerente al 100% nella sua terminologia"? –

+1

Una dichiarazione typedef è una definizione * e * una dichiarazione. Immagino che la gente di solito si riferisca a loro come "dichiarazioni" invece di definizioni perché quest'ultima suona ridondante. –

+0

E FWIW, la lingua esatta dallo standard è la seguente: "* In una dichiarazione il cui identificatore di classe di memoria è' typedef', ogni dichiaratore definisce un identificatore come un nome typedef che indica il tipo specificato per l'identificatore * ". –

risposta

3

A typedef dichiarazione è una definizione.

N1570 6.7p5:

Una dichiarazione specifica l'interpretazione e gli attributi di un insieme di identificatori. Un Definizione di un identificatore è una dichiarazione di tale identificatore che:

  • per un oggetto, causa di stoccaggio da assegnare per quell'oggetto;
  • per una funzione, include il corpo della funzione;
  • per una costante di enumerazione, è la (solo) dichiarazione dell'identificatore;
  • per un nome typedef, è la prima (o unica) dichiarazione dell'identificatore.

In C99, gli ultimi due punti elenco sono stati combinati; C11 ha introdotto la possibilità di dichiarare lo stesso typedef due volte.

Nota che solo oggetti, funzioni, costanti di enumerazione, e typedef nomi possono avere definizioni. Si potrebbe sostenere che, data:

enum foo { zero, one}; 

che non ha molto senso considerare che si tratta un definizione di zero e one, ma non di foo o enum foo.D'altra parte, una dichiarazione enum, struct o union, sebbene crei un tipo che in precedenza non esisteva, non definisce un identificatore che è il nome di quel tipo - e per struct se union, il nome del tag può essere usato (come un tipo incompleto) anche prima che il tipo sia stato definito. Le definizioni definiscono gli identificatori, non (necessariamente) le entità a cui si riferiscono.

Per quanto riguarda il motivo per cui non è chiamato "definizione" nella sottosezione che lo definisce, fa parte della sezione 6.7 "Dichiarazioni", che copre tutti i tipi di dichiarazioni (alcune delle quali sono anche definizioni). Il termine definizione è definito nella parte introduttiva del 6.7.

Come per il nome typedef, ha causato una discreta quantità di confusione nel corso degli anni in quanto non corrisponde a un tipo. Forse typename sarebbe stata una scelta migliore, o anche typealias. Ma poiché definisce l'identificatore, typedef non è del tutto fuorviante.

+0

concordato. È una definizione Sto precisando che dovrebbe essere chiamata una definizione typedef sulla base di (come si fa notare) essendo una definizione. ;) È una strana anomalia in bella vista e non l'avevo notato da 20 anni. – Persixty

+0

@DanAllen: Ho aggiunto un paio di paragrafi alla fine della mia risposta proprio mentre stavi pubblicando il tuo commento. –

+0

Keith, penso di averlo detto altrove che definisce. Definisce un alias. Ma accetto che le tue alternative citate siano tutte buone. Basato sulla (utile) comune distinzione data alle persone che chiedono "qual è la differenza" che definisce qualcosa come la qualcos'altro è una definizione. Solo non la definizione di qualcosa di completamente nuovo! Nessuno ha ancora sostenuto che sia una dichiarazione (eccetto che penso nel senso che tutte le definizioni sono dichiarative). Penso che stiamo violentemente concordando. È una buona cosa. – Persixty

Problemi correlati