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)
- ... 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.
Kompiliert nicht mit welchem Fehler? – Carcigenicate
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
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. –