Имя, которое объявлено в области видимости, будет скрывать объявление с тем же именем во внешней области видимости. Имя не должно иметь несколько конфликтующих объявлений в данной области, иначе вы получите ошибку, которую вы видели.
Во втором примере в области функции есть только одно объявление main
, которое скрывает объявление int main()
с внешнего склона. (Имена функций находятся во внешней области, а не в их собственных областях.) В первом примере в области функции есть два объявления stardooms
.
Если бы вы также повторно объявили int main()
в области действия функции во втором примере, вы бы увидели ту же ошибку. Аналогично, если бы вы переместили определение функции stardooms
перед определением функции main
и удалили объявление int stardooms(int)
из области действия функции main
, вы бы не получили эту ошибку ( но вы получите другой способ, чем пытаться использовать целое число как функцию).