Как получить доступ к переменной внешнего блока во внутреннем блоке, когда внутренний блок имеет такое же объявление переменной? - PullRequest
3 голосов
/ 07 октября 2010
int main(int argc, char** argv) {
    int i=5;
    {
        int i=7;
        printf("%d\n", i);
    }
    return 0;
}

Если я хочу получить доступ к внешнему i (int i=5) значению в printf, то как это можно сделать?

Ответы [ 7 ]

8 голосов
/ 07 октября 2010

Соответствующая часть стандарта C99, раздел 6.2.1 (Области применения идентификаторов):

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

Обновление

Для предотвращения исчезновения ответа pmg : Вы можете получить доступ к переменной внешнего блока, объявив указатель на нее до того, как произойдет скрытие:

int i = 5;
{
    int *p = &i;
    int i  = 7;
    printf("%d\n", *p); /* prints "5" */
}

Конечно, указывать скрытые переменные никогда не нужно и всегда плохой стиль.

4 голосов
/ 23 ноября 2012

Сохранить внешний i в другой переменной и затем объявить внутренний iкак-

int i = 5;
{
    int p = i;
    int i  = 7;
    printf("%d\n", p); /* prints "5" */
}
3 голосов
/ 07 октября 2010

Переименуйте переменную.

2 голосов
/ 07 октября 2010

Вы не можете получить к нему доступ.

1 голос
/ 07 октября 2010

Создайте указатель на старый i перед определением нового. (демо на http://ideone.com/dobQX)

Но мне больше всего нравится комментарий Джонатана!

1 голос
/ 07 октября 2010

Я не понимаю, почему вы не можете назвать одно «I» и одно «J».

Различные имена для них позволят вам выбрать либо.

0 голосов
/ 07 октября 2010

Краткий ответ: вы не можете. Он скрыт i во внутренней области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...