2010-04-06 4 views
8

Ich habe ein Problem mit den typedef Schlüsselwörter in C-Sprache.Grammatik und Syntax von typedef in C Sprache

In meinem Programm verwende ich die folgenden Codes:

typedef int* a[10]; 

int main(){ 
int a[10]; 
} 

sie gut funktionieren. Aber warum gibt es keine Konflikte zwischen einer Variablen und einem Typ mit dem gleichen Namen?

Grüße.

+0

Coole Frage - ich habe nie wirklich darüber nachgedacht. Der Typ, den du definierst, ist verdammt komisch, ich hoffe, er dient nur zu Demonstrationszwecken :-) –

+0

Du hast Recht, ich möchte meinen Code nicht so schwer lesen wie ein Puzzle. :-) –

+0

Wow, GCC ist sogar in Ordnung mit "a a;" (solange es in main, nicht global ist) –

Antwort

6

Siehe msdn C language reference:

Typedef Namen teilen den Namensraum mit gewöhnlichen Bezeichner (siehe Name Spaces für weitere Informationen). Daher kann ein Programm einen Typdefinitionsnamen und einen lokalen Gültigkeitsbereichsbezeichner mit demselben Namen haben.

+1

Neugieriges Zitat. Wenn man es schnell liest, fühlt es sich an wie ein Oxymoron. Wenn sie einen Namensraum teilen, wie könnten sie denselben Namen haben? Liegt das am * local-scope *? –

+0

Hmm ... der Link "Name Spaces", auf den Sie zeigen, sagt: "Typedef-Namen können nicht als Bezeichner im selben Bereich verwendet werden." –

+3

@Eli: '{int x; {float x;}} ' – sbi

6

Der C-Standard erklärt (Abschnitt 6.2.1 - Scopes von Identifikatoren):

Eine Kennung ein Objekt bezeichnen kann; eine Funktion; ein Tag oder ein Mitglied einer Struktur, Union oder Enumeration; a typedef name; ein Markenname; ein Makro Name; oder ein Makroparameter. Der gleiche Bezeichner kann verschiedene Entitäten an verschiedenen Stellen im Programm bezeichnen.

K & R2 sagen (A.11.1 - lexikalischen Gültigkeitsbereich)

Identifiers fallen in mehrere Namen Räume, die nicht stören ein anderen; die gleiche Kennung kann für verschiedene Zwecke verwendet werden, auch in der gleiche Bereich, wenn die Verwendungen in verschiedenen Namensräumen sind. Diese Klassen sind: Objekte, Funktionen, typedef Namen und Enum-Konstanten; Etiketten; Tags von Strukturen oder Vereinigungen und Enumerationen; und Mitglieder jeder Struktur oder Vereinigung einzeln.

Ich muss zugeben, das verwirrt mich. Lesen des zweiten Zitats scheint, dass Variablennamen und typedef -ed-Typen kollidieren sollten.

+0

Aber ich bin immer noch nicht sehr klar, wie kann "a" verschiedene Entitäten koexistieren in den vorhergehenden Codes koexistieren. Können Sie mir bitte weitere Erklärungen geben? Vielen Dank. –

+1

@Neil: Ich habe die Interpunktion anders gelesen. Scheint, dass Objekte, Funktionen, typedef-Namen und enum-Konstanten eine Klasse sind. Weiter (nach einem Semikolon) Labels, nächste Tags, etc. –

3

Variablen und typedefs besetzen die gleichen Namespace und können nicht Freigabenamen mit anderen Bezeichnern in genau dem gleichen Umfang.

Allerdings ist Ihre zweite a innerhalb main, und die Geltungsregeln gelten: die zweite a überschreibt die erste.

Sie können die gleiche Sache mit einfach nur Variablen tun:

int a; 

int main() { 
    int a; 
} 

Sie werden bemerken, dass, wenn Sie die Variablendeklaration außerhalb Haupt bewegen, wird das Programm nicht kompilieren.