Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Warning в gcc
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
beer_warrior
При объявлении локальной переменной:
warning: declaration of 'adr' shadows a global declaration
warning: shadowed declaration is here

Не могу понять откуда появлятся. В одном файле есть в другом нет. Подозреваю ключик в мэйке какой-то упустил.
help.gif
Tiro
Цитата(beer_warrior @ Feb 3 2007, 17:24) *
При объявлении локальной переменной:
warning: declaration of 'adr' shadows a global declaration
warning: shadowed declaration is here

Не могу понять откуда появлятся. В одном файле есть в другом нет. Подозреваю ключик в мэйке какой-то упустил.
help.gif


Думаю, дело не в ключике.

1-е предупреждение: декларация локальной переменной 'adr' перекрывает видимость глобальной декларации с тем же именем
2-е предупреждение: перекрытая глобальная декларация находится здесь ???
Далее должны следовать имя файла и номер строки.

Измените имя локальной переменной, если нужен доступ к глобальной переменной с этим именем.

С уважением.
beer_warrior
Цитата
1-е предупреждение: декларация локальной переменной 'adr' перекрывает видимость глобальной декларации с тем же именем2-е предупреждение: перекрытая глобальная декларация находится здесь ???

Эт я понимаю.Но почему так? Они ведь находятся в разных областях видимости. Да и размещаются - одна в дата сегменте другая с стеке.
Раньше все прокатывало на ура.
Leen
Но ведь одна из них глобальная, стало быть, она видна там, где объявлена локальная, так? Т.е.:

Код
//file1.c
/*глобальная*/ [b]int[/b] adr;

int main(void)
{
foo();
}

//file2.c
int foo(void)
{
// до "здесь" глобальная переменная еще видна
/*локальная*/ int adr;// а сюда посылает варнинг2, так?
return adr;
}


Непонятно, как это раньше работало.. Может, варнинги были запрещены?
Tiro
Цитата(beer_warrior @ Feb 4 2007, 00:08) *
Они ведь находятся в разных областях видимости. Да и размещаются - одна в дата сегменте другая с стеке.
Раньше все прокатывало на ура.


Область видимости локальных имен вложена в область видимости глобальных имен, поэтому там, где объявлено имя локальной переменной, видны и локальные и глобальные имена одновременно. Такая ситуация вызывает предупреждение компилятора, поскольку он будет работать с локальной переменной, игнорируя глобальную. Он Вас просто предупреждает, "а уверен ли ты, программист, что ты собираешься работать с локальной переменной?"

Есть ключ, контролирующий это предупреждение:
-Wshadow
Warn whenever a local variable shadows another local variable, parameter or global variable or whenever a built-in function is shadowed.

Возможно, поменялась установка этого ключа по умолчанию в какой-либо из версий компилятора в связи с расширением поддержки C99.

А в каком сегменте будут размещаться используемые переменные определяется как раз областью их видимости. В конце концов, используйте префиксы для глобальных имен, а для ограничения видимости имен переменных пределами одного файла используйте static.

С уважением.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.