2017-07-28 3 views
4

ignorierend, warum ich möchte, dies zu tun, nur versuchen, zu verstehen, was hier passiert: Dieser Code kompiliert:typedef und Variablennamen

#include <stdio.h> 
typedef char byte; 

int main (void) 
{ 
    byte var_byte; 
    int byte = 10; 

    printf("\n Test program: %d\n", byte); 
} 

Aber wenn ich die Reihenfolge ändern, in der die Variablen deklariert werden Es kompiliert nicht.

nicht kompiliert dies nicht:

#include <stdio.h> 
typedef char byte; 

int main (void) 
{ 
    int byte = 10; 
    byte var_byte; 

    printf("\n Test program: %d\n", byte); 
} 

Fehler Compiler:

b.c:7:8: error: expected ‘;’ before ‘var_byte’ 
    byte var_byte; 
     ^~~~~~~~ 

Könnte jemand bitte erklären, warum Dinge bestellen?

+0

Kompiliert nicht mit welchem ​​Fehler? – Carcigenicate

+1

Und in der zweiten, erstellen Sie eine Variable mit dem gleichen Namen wie der Typ, und versuchen Sie dann, den Typ darunter zu verwenden. Sie überschatten wahrscheinlich das Typedef mit dem Variablennamen. – Carcigenicate

+0

Sie können Folgendes beachten: 'int main (void) {typedef char-Byte; Byte var_byte; int Byte = 10; printf ("\ n Testprogramm:% d \ n", Byte); } 'kompiliert nicht, da der Typname' byte' im Bereich von 'main()' nicht geändert werden kann - er kann nur in einem inneren Bereich geändert werden. –

Antwort

1

bearbeiten hier: (misunderstand der Frage)

Wenn Sie eine Variable in C deklarieren es sieht nicht für typedef Strukturen zu sehen, ob eine Struktur das gleiche mit der Variable mit dem Namen. Auf dem ersten Code,

byte var_byte; 

diese Codezeile kommt vor der Deklaration der Variablen int byte. Der Computer wird nach dem jüngsten Verweis des Wortbytes suchen, da es der Strukturname hier war.

Auf der zweiten gibt die Variable int byte keinen Fehler zurück, weil Sie weiterhin Variablen mit demselben Strukturtypnamen in C erstellen können. Aber nachdem Sie dies tun, können Sie keine neuen Strukturen für diese Struktur als Computer erstellen wird denken, dass es an den Variablennamen und nicht die der Strukturtyp als die Variable deklariert wurde zuletzt bezieht

+0

Dies erklärt nicht (zumindest nicht klar), warum die Bestellung wichtig ist. – klutt

+0

@ klutt Bearbeitung ist fertig. ich habe es falsch gelesen –

+0

@Schwifty McSchwifulface wie ist es jetzt? –

7

In diesem Programm

#include <stdio.h> 
typedef char byte; 

int main (void) 
{ 
    int byte = 10; 
    byte var_byte; 

    printf("\n Test program: %d\n", byte); 
} 

der Name der variablen byte versteckt den Namen des Typdef.

Von dem C Standard (6.2.1 Scopes von Kennungen)

  1. ... If an identifier designates two different entities in the same name space, the scopes might overlap. If so, the scope of one entity (the inner scope) will end strictly before the scope of the other entity (the outer scope). Within the inner scope, the identifier designates the entity declared in the inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope.

beachten, dass der Name einer Kennung und einen typedef Namen auf den gleichen Namensraum gehört.

Der typedef-Name wird im globalen Bereich (Dateibereich) deklariert, während der Name der Variablen im inneren Blockbereich deklariert wird und der Name der Variablen den im globalen Bereich deklarierten Namen verbirgt.

Betrachten Sie dieses Programm.

#include <stdio.h> 
typedef char byte; 

void f(void); 

int main (void) 
{ 
    int byte = 10; 

    printf("\n Test program: %d\n", byte); 

    f(); 
} 

void f(void) 
{ 
    byte c = 'A'; 
    printf("%c\n", c); 
} 

Innerhalb des Blocks Umfang der Funktion main (der innere Rahmen relativ zum Datei scope) den Namen des typedef wird durch die Deklaration der Variablen mit dem gleichen Namen versteckt.

Innerhalb des Blockbereichs der Funktion f ist jedoch der im Typdef deklarierte Name sichtbar, da keine andere Deklaration im Blockbereich der Funktion den in typedef deklarierten Namen verbirgt.

hier ein interessantes Programm, das mit dem Punkt der Erklärung befaßt mich (es ist ein C++ Begriff)

#include <stdio.h> 

size_t byte = 255; 

int main(void) 
{ 
    typedef int byte[byte]; 

    { 
     byte byte; 

     printf("sizeof(byte) = %zu\n", sizeof(byte)); 
    } 

    return 0; 
} 

Sein Ausgang ist es in der Datei Umfang Hier wie

sizeof(byte) = 1020 

aussehen könnte mit dem Namen wird deklarierte Variable byte

size_t byte = 255; 

im äußeren Block SOZ pe der Funktion main gibt es eingeführt typedef name byte.

typedef int byte[byte]; 

Es verbirgt die zuvor deklarierten Namen byte nach Erklärung des declarator. Das ist in diesem typedef

typedef int byte[byte]; 

den Namen byte in den eckigen Klammern mit dem globalen Namen entspricht byte.

Dann ist im inneren Block Geltungsbereich deklariert ein Array mit dem gleichen Namen byte, die den Namen Typedef versteckt.

byte byte; 

beachten, dass in dem Ausdruck

sizeof(byte) 

wird den Namen des Arrays nicht der typedef-Name verwendet.