2013-05-07 7 views
10

Da §6.2.7.5 (pagina 66):Che cos'è un tipo composito in C?

ESEMPIO Date le seguenti dichiarazioni portata due file:

int f(int (*)(), double (*)[3]); 
int f(int (*)(char *), double (*)[]); 

tipo composito risultante per la funzione è:

int f(int (*)(char *), double (*)[3]); 

Sopra Nell'esempio, spiegano che un tipo composito è un tipo, compatibile con due tipi diversi. Intuirò intuitivamente la frase "tipo composito" come "strutture e unioni", che sembra essere fuori bersaglio.

Che cos'è un tipo composito in C e a cosa serve? Qualcuno potrebbe spiegare l'esempio sopra nei dettagli?

+3

Penso tu voglia dire §6.2.7? – unwind

+0

Hai considerato di scorrere fino al testo sopra quell'esempio (6.2.7/3) dove, a sorpresa, viene indicata la definizione di tipo composito? – Lundin

+0

Sì, 6.2.7, errore mio. Ho letto la definizione (due volte), ma non l'ho capita. In realtà sono persino confuso su come "double (*) [3]" verrebbe utilizzato. – Vorac

risposta

5

avrei intuitivamente capire la frase "tipo composito" come "le strutture e le unioni" significato, che sembra essere il modo centra la porta.

Nella definizione linguaggio C, array e le strutture sono aggregati tipi (tipi composti da più elementi). I sindacati sono una specie di animale, dal momento che possono assumere solo il valore di un elemento alla volta.

I tipi di materiale composito sono più un problema per gli implementatori di compilatori, piuttosto che le scimmie di codice run-of-the-mill.Tu e io non tenteremmo di definire un tipo composito o di dichiarare oggetti di quel tipo.

Nell'esempio fornito, si dispone di due dichiarazioni di ambito file per una funzione f leggermente diverse l'una dall'altra. In base alle regole presentate in 6.2.7/3, il compilatore determina un tipo che funziona per entrambi, in modo che possa applicare la semantica del tipo in fase di compilazione (ad esempio, qualsiasi chiamata a f può essere correttamente controllata, anche con le dichiarazioni leggermente diverse) e generare il codice macchina appropriato per chiamare la funzione.

6

probabilmente non sono la persona giusta per rispondere a questo, ma per quello che vale, qui è la logica C99, che può essere utile:

6.2.7 tipo compatibile e composito tipo

I concetti di tipo compatibile e tipo composito sono stati introdotti per consentire a C89 di discutere quelle situazioni in cui le dichiarazioni di tipo non devono essere identiche. Questi termini sono particolarmente utili per spiegare la relazione tra un tipo incompleto e un tipo completato. Con l'aggiunta degli array di lunghezza variabile (§6.7.5.2) in C99, la compatibilità del tipo di array è stata estesa in modo che gli array di lunghezza variabile siano compatibili sia con un array di dimensioni costanti note di sia con un array con un tipo incompleto.

dichiarazioni Struttura, l'unione, o tipo di censimento nel due diverse unità traduzione non dichiarano formalmente lo stesso tipo, anche se il testo di queste dichiarazioni provengono dallo stesso file di intestazione, dal momento che unità di traduzione si sono disgiunti. Lo standard quindi specifica regole di compatibilità aggiuntive per tali tipi in modo che due dichiarazioni siano compatibili se sono sufficientemente simili.

TRANQUILLA VARIAZIONE C99

Strutture o dichiarazioni di tipo sindacale in diverse unità di traduzione ora deve avere etichette identiche per essere compatibile.