typedef и имена переменных

Игнорируя, почему я хотел бы это сделать, просто пытаюсь понять, что здесь происходит: этот код компилирует:

#include  typedef char byte; int main (void) { byte var_byte; int byte = 10; printf("\n Test program: %d\n", byte); } 

Но, если я изменю порядок, в котором объявлены переменные, он не компилируется.

Это НЕ СОСТАВЛЯЕТ:

 #include  typedef char byte; int main (void) { int byte = 10; byte var_byte; printf("\n Test program: %d\n", byte); } 

Ошибка компилятора:

 bc:7:8: error: expected ';' before 'var_byte' byte var_byte; ^~~~~~~~ 

Может ли кто-нибудь объяснить, почему порядок имеет значение?

В этой программе

 #include  typedef char byte; int main (void) { int byte = 10; byte var_byte; printf("\n Test program: %d\n", byte); } 

имя byte переменной скрывает имя typedef.

Из стандарта C (6.2.1 Области идентификаторов)

  1. … Если идентификатор обозначает два разных объекта в одном и том же пространстве имен, области действия могут перекрываться. Если это так, объем одного объекта (внутренний объем) будет полностью закрыт перед областью действия другого объекта (внешней области). Внутри внутренней области идентификатор обозначает объект, объявленный во внутренней области; объект, объявленный во внешней области, скрыт (и не отображается) во внутренней области.

Обратите внимание на то, что имя идентификатора и имя typedef принадлежат к тому же пространству имен.

Имя typedef объявляется в глобальной области (область файла), а имя переменной объявляется во внутренней области блока, а имя переменной скрывает имя, объявленное в глобальной области.

Рассмотрим эту программу.

 #include  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 ); } 

В пределах объема блока функции main (внутренний объем относительно области файла) имя typedef скрывается объявлением переменной с тем же именем.

Однако внутри области блока функции f имя, объявленное в typedef, видимо, потому что ни одно другое объявление в области блока функции не скрывает имя, объявленное в typedef.

Вот более интересная программа, которая касается точки объявления (это термин C ++)

 #include  size_t byte = 255; int main(void) { typedef int byte[byte]; { byte byte; printf( "sizeof( byte ) = %zu\n", sizeof( byte ) ); } return 0; } 

Его вывод может выглядеть так:

 sizeof( byte ) = 1020 

Здесь в области файла объявлена ​​переменная с byte имени

 size_t byte = 255; 

В области внешнего блока функции main вводится byte имени typedef.

 typedef int byte[byte]; 

Он скрывает ранее объявленный byte имени после объявления декларатора. То есть в этом typedef

  typedef int byte[byte]; 

byte имени в квадратных скобках соответствует глобальному byte имени.

Затем во внутренней области блока объявляется массив с таким же именем byte который скрывает имя typedef.

 byte byte; 

Обратите внимание на это в выражении

 sizeof( byte ) 

используется имя массива, а не имя typedef.

Редактировать здесь: (непонимание вопроса)

Когда вы объявляете переменную в C, она не ищет структуры typedef чтобы увидеть, совпадает ли структура с переменной. В первом коде,

 byte var_byte; 

эта строка кода предшествует объявлению переменной int byte . Компьютер будет искать самую последнюю ссылку на байт слова, поскольку это было название структуры здесь.

Во втором случае переменная int byte не возвращает ошибку, потому что вы можете создавать переменные с тем же именем типа структуры в C. Но после этого вы не можете создавать новые структуры для этой структуры, поскольку компьютер будет думать, что это относится к имени переменной, а не к типу структуры, поскольку переменная была объявлена совсем недавно