Раскрытие теневой переменной, когда внешняя переменная не является глобальной - PullRequest
2 голосов
/ 23 марта 2019

Я видел в этом посте , что мы можем раскрыть глобальную переменную, в которой локальная переменная с тем же именем находится в области видимости, используя extern и составной оператор.

В этомpost, приведенный пример похож на

#include<stdio.h>
int a = 12;             
int main(void)          
{           
    int a = 15;             
    printf("Inside a's main local a = : %d\n", a);

    {
        extern int a;
        printf("In a global a = %d\n", a);
    }

    return 0; 
}

, а теневая переменная является глобальной переменной.

Но когда я попробовал программу наподобие

#include<stdio.h>
int main()
{
    int i=5;
    for(int i=0; i<2; ++i)
    {
        {
            extern int i;
            printf("\nGlobal: %d", i);
        }
        printf("\nLocal: %d", i);
    }
}

, она не удалась.

Я попытался сделать внешнюю i статической, если она работает, только если внешняя переменная является статической, но все еще не работает.

Может кто-нибудь сказать мне, почему вторая программа не 'т работаешь?И как обойти это, если это возможно?

Может быть, этот метод работает, только если внешняя переменная является глобальной?

Редактировать: комментарии заставили меня понять, что использование extern будет простосделать глобальную переменную видимойНо есть ли способ обойти это без изменения имени переменной?

1 Ответ

0 голосов
/ 23 марта 2019

В приведенном ниже снимке кода

#include<stdio.h>
int main()
{
    int i=5;
    for(int i=0; i<2; ++i)
    {
        {
            extern int i; /* just declaration */
            printf("\nGlobal: %d", i);
        }
        printf("\nLocal: %d", i);
    }
}

Ошибка не получается, поскольку компоновщик не может найти определение из i.

Один из способов преодолеть это

#include<stdio.h>
int main()
{
    int i=5; /* linker will not search this for definition of i */
    for(int i=0; i<2; ++i)
    {
        {
            extern int i; /* search definition other than this translation unit */
            printf("\nGlobal: %d", i);
        }
        printf("\nLocal: %d", i);
    }
}
int i = 100; /* this is the definition of extern i */

Другой способ - предоставить определение extern переменной i в другом файле. В идеале extern предназначено для внешней связи т.е. в другом файле, а не в том же файле.

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