Если определить две отдельные идентификаторов таким же имя для различных объектов в том же пространстве имен, они могут перекрывать друг друг. C11
стандарт, глава §6.2.1 состояния,
Если идентификатор обозначает две разные сущности в одноименной пространстве, прицелы может перекрываться ....
См Сноска: Почему в этот сценарий, как sum
s в том же пространстве имен
Итак, когда вы повторно определить идентификатор с каким-либо другим типом,
.... Если да, то объем одного лица (внутренней области видимости) закончится строго до объема другого лица (внешней области). Внутри внутренней области идентификатор обозначает объект, объявленный во внутренней области; объект, объявленный во внешней области, равен , скрытый (и не отображается) во внутренней области.
Это означает, что, по существу, в вашем случае, внутри функции sum()
, когда вы определяете int sum
, в основном вы затенения функциюsum
. После переопределения sum
является идентификатором типа int
, в котором область действия. Таким образом, внутри функции sum()
вы не можете позвонить по телефону sum()
, так как это тип int
.
Однако FWIW, вызов sum()
в main()
(или, скорее, за пределами самого sum()
) должен быть действительным, так как в этой точке, int sum
будет вне сферы.
Изменить имя переменной int sum
на что-то другое.
Благодаря @pmg для коррекции
EDIT:
Как уже упоминалось in the other answer by @juanchopanza, после изменения затенения имени переменного, ваша программа будет собирать и как только вы запустите его, вы» ll face infinite recursion из-за безусловный звонок в sum()
внутри sum()
сам. Вам нужно добавить перерыв состояние до конца (return
от) рекурсия.
Сноска:
Ссылаясь на C11
, глава §6.2.3, пространства имен, можно сказать, есть отдельные пространства имен для различных категорий идентификаторов, например 1) имена ярлыков 2) теги структур, союзов и перечислений, 3) члены структур или союзов и 4) все остальные идентификаторы.
Таким образом, в данном конкретном случае, функция sum()
и int sum
определение будет находиться в том же пространстве имен, для sum()
области видимости функции в
Вы действительно хотите, чтобы переменная и функция имели одно и то же имя? –
@SouravGhosh Почему это проблема? –
И вообще, как вы думаете, что вы делаете при вызове 'sum (x, size);'? Нет ничего, что бы остановить рекурсию, поэтому ваша программа будет проходить цикл в течение всего дня (по крайней мере, до тех пор, пока она не достигнет максимального стека). – Eregrith