Грамматика и синтаксис определения типа на языке C

У меня есть проблема с ключевыми словами определения типа на языке C.

В моей программе я использую следующие коды:

typedef int* a[10];

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

они работают хорошо. Но почему нет никаких конфликтов между переменной и типом, совместно использующим то же имя a?

С уважением.

8
задан Summer_More_More_Tea 6 April 2010 в 11:47
поделиться

3 ответа

См. Ссылка на язык C msdn :

Имена Typedef совместно используют пространство имен с обычными идентификаторами (см. Пространства имен для получения дополнительной информации). Следовательно, программа может иметь одно и то же имя typedef и идентификатор локальной области.

6
ответ дан 5 December 2019 в 11:23
поделиться

Стандарт C говорит (Раздел 6.2.1 - Области действия идентификаторов):

Идентификатор может обозначать объект; функция ; тег или член структуры, объединения или перечисления ; имя typedef ; название ярлыка; имя макроса ; или параметр макроса. Один и тот же идентификатор может обозначать разные объекты в разных точках программы .

K и R2 говорят (A.11.1 - Lexical Scope)

Идентификаторы попадают в несколько пространств имен , которые не мешают одному другому; один и тот же идентификатор может использоваться для разных целей, даже в одной и той же области, если он используется в разных пространствах имен. Этими классами являются: объекты, функции, имена typedef и константы перечисления; метки; теги структур или объединений и перечисления; и члены каждой структуры или объединения по отдельности.

Должен признаться, это меня смущает. Читая вторую цитату, выясняется, что имена переменных и typedef -ed types должны конфликтовать .

6
ответ дан 5 December 2019 в 11:23
поделиться

Переменные и определения типов занимают одно и то же пространство имен и могут не совместно использовать имена с другими идентификаторами в точно такой же области.

Однако ваш второй a находится внутри main , и применяются правила области действия: второй a переопределяет первый.

Вы можете сделать то же самое с простыми переменными:

int a;

int main() {
    int a;
}

Вы заметите, что если вы переместите объявление переменной за пределы main, программа не будет компилироваться.

3
ответ дан 5 December 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: