У меня есть проблема с ключевыми словами определения типа на языке C.
В моей программе я использую следующие коды:
typedef int* a[10];
int main(){
int a[10];
}
они работают хорошо. Но почему нет никаких конфликтов между переменной и типом, совместно использующим то же имя a?
С уважением.
См. Ссылка на язык C msdn :
Имена Typedef совместно используют пространство имен с обычными идентификаторами (см. Пространства имен для получения дополнительной информации). Следовательно, программа может иметь одно и то же имя typedef и идентификатор локальной области.
Стандарт C говорит (Раздел 6.2.1 - Области действия идентификаторов):
Идентификатор может обозначать объект; функция ; тег или член структуры, объединения или перечисления ; имя typedef ; название ярлыка; имя макроса ; или параметр макроса. Один и тот же идентификатор может обозначать разные объекты в разных точках программы .
K и R2 говорят (A.11.1 - Lexical Scope)
Идентификаторы попадают в несколько пространств имен , которые не мешают одному другому; один и тот же идентификатор может использоваться для разных целей, даже в одной и той же области, если он используется в разных пространствах имен. Этими классами являются: объекты, функции, имена typedef и константы перечисления; метки; теги структур или объединений и перечисления; и члены каждой структуры или объединения по отдельности.
Должен признаться, это меня смущает. Читая вторую цитату, выясняется, что имена переменных и typedef
-ed types должны конфликтовать .
Переменные и определения типов занимают одно и то же пространство имен и могут не совместно использовать имена с другими идентификаторами в точно такой же области.
Однако ваш второй a
находится внутри main
, и применяются правила области действия: второй a
переопределяет первый.
Вы можете сделать то же самое с простыми переменными:
int a;
int main() {
int a;
}
Вы заметите, что если вы переместите объявление переменной за пределы main, программа не будет компилироваться.