2013-05-07 8 views
10

Von §6.2.7.5 (Seite 66):Was ist ein zusammengesetzter Typ in C?

Beispiel die beiden folgenden Dateigültigkeitsbereich Erklärungen gegeben:

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

Der resultierende Verbundtyp für die Funktion ist:

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

Above Im Beispiel erklären sie, dass ein zusammengesetzter Typ ein Typ ist, der mit zwei verschiedenen Typen kompatibel ist. Ich würde intuitiv den Ausdruck "zusammengesetzter Typ" verstehen, der "Strukturen und Verbindungen" bedeutet, der weit außerhalb des Ziels zu sein scheint.

Was ist ein zusammengesetzter Typ in C und wofür wird es verwendet? Könnte jemand bitte das obige Beispiel ausführlich erklären?

+3

Ich denke, du meinst §6.2.7? – unwind

+0

Haben Sie darüber nachgedacht, bis zum obigen Text (6.2.7/3) zu scrollen, wo überraschenderweise die Definition des zusammengesetzten Typs angegeben wird? – Lundin

+0

Ja, 6.2.7, mein Fehler. Ich habe die Definition (zweimal) gelesen, aber nicht verstanden. Ich bin sogar verwirrt darüber, wie "double (*) [3]" verwendet werden würde. – Vorac

Antwort

5

Ich würde den Ausdruck „Verbundtyp“ im Sinne von „Strukturen und Gewerkschaften“ intuitiv verstehen, die Art und Weise zu sein scheint off-target.

In der C-Sprache Definition Arrays und Strukturen sind Aggregate Typen (Typen aus mehreren Elementen zusammengesetzt ist). Gewerkschaften sind ihr eigenes Tier, da sie nur den Wert eines Elements auf einmal annehmen können.

Composite Typen sind eher ein Problem für Compiler-Implementatoren, als uns gewöhnliche Code-Affen.Sie und ich würden nicht versuchen, einen zusammengesetzten Typ zu definieren oder Objekte dieses Typs zu deklarieren.

Im Beispiel haben Sie zwei Dateibereichsdeklarationen für eine Funktion f, die sich leicht voneinander unterscheiden. Basierend auf den in 6.2.7/3 vorgestellten Regeln bestimmt der Compiler einen Typ, der für beide funktioniert, so dass er Typensemantik zum Zeitpunkt der Kompilierung erzwingen kann (dh alle Aufrufe an f können auch mit den leicht abweichenden Deklarationen richtig überprüft werden)) und generieren Sie den richtigen Maschinencode, um die Funktion aufzurufen.

6

Ich bin wahrscheinlich nicht die richtige Person, dies zu beantworten, aber für das, was es wert ist, hier ist die C99 Gründe, die hilfreich sein können:

6.2.7 kompatible Art und Verbundtyp

Die Konzepte kompatibler Typ und zusammengesetzter Typ wurden eingeführt, damit C89 diejenigen Situationen diskutieren kann, in denen Typdeklarationen nicht identisch sein müssen. Diese Begriffe sind besonders nützlich, um die Beziehung zwischen einem unvollständigen Typ und einem abgeschlossenen Typ zu erklären. Mit dem Hinzufügen von Variablen Länge Arrays (§6.7.5.2) in C99 wurde Array-Typ-Kompatibilität erweitert , so dass Arrays variabler Länge sind kompatibel mit einem Array von bekannte konstante Größe und ein Array mit einem unvollständigen Typ.

Struktur, Vereinigung oder Aufzählungstyp Erklärungen in zwei verschiedenen Übersetzungseinheiten erklären formal nicht die gleiche Art, auch wenn der Text dieser Erklärungen aus derselben Header-Datei, da die Übersetzungseinheiten sind selbst disjunkt. Der Standard, also , spezifiziert zusätzliche Kompatibilitätsregeln für solche Typen, so dass zwei derartige Deklarationen kompatibel sind, wenn sie ausreichend ähnlich sind.

QUIET VERÄNDERUNG IN C99

Strukturen oder Typ union Erklärungen in verschiedenen Übersetzungseinheiten jetzt müssen identische Tags haben kompatibel zu sein.