вложенные переменные-дубликаты
От: Аноним  
Дата: 19.08.09 21:45
Оценка:
Подскажите пожалуйста можно ли заставить компилятор (VC, GCC) хотя бы ругаться при повторном объявлении функции во вложенной области видимости:
void foo()
{
    int a = 5;
    {
        int a;
        a = 3;
    }
    printf( "%d\n", a ); // выдаст естественно "5"
}

Можно ли избавиться от этой мега-фичи опциями компилятора или хотя бы чтобы он предупреждал о возможной проблеме?
Re: вложенные переменные-дубликаты
От: Юрий Жмеренецкий ICQ 380412032
Дата: 19.08.09 22:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите пожалуйста можно ли заставить компилятор (VC, GCC) хотя бы ругаться при повторном объявлении функции во вложенной области видимости:

А>
void foo()
А>{
А>    int a = 5;
А>    {
А>        int a;
А>        a = 3;
А>    }
А>    printf( "%d\n", a ); // выдаст естественно "5"
А>}

А>Можно ли избавиться от этой мега-фичи опциями компилятора или хотя бы чтобы он предупреждал о возможной проблеме?

C:\temp>cl test.cpp /analyze
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

test.cpp
c:\temp\test.cpp(6) : warning C6246: Local declaration of 'a' hides declaration of the same name in outer scope. For addition al information, see previous declaration at line '4' of 'c:\temp\test.cpp': Lines: 4

Re[2]: вложенные переменные-дубликаты
От: Аноним  
Дата: 20.08.09 06:49
Оценка:
ЮЖ>C:\temp>cl test.cpp /analyze
эх, но :

/analyze is only available in Enterprise (team development) versions for x86 compilers.

может тогда в GCC есть что-то?
Re: вложенные переменные-дубликаты
От: Кодт Россия  
Дата: 20.08.09 11:35
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Подскажите пожалуйста можно ли заставить компилятор (VC, GCC) хотя бы ругаться при повторном объявлении функции во вложенной области видимости:


Это, вообще-то, соответствие стандарту.
Хочешь нестандартного поведения? ну-ну.

А>Можно ли избавиться от этой мега-фичи опциями компилятора или хотя бы чтобы он предупреждал о возможной проблеме?


Статические анализаторы кода. Всякие там lint-ы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
Re[2]: вложенные переменные-дубликаты
От: Аноним  
Дата: 20.08.09 12:59
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Это, вообще-то, соответствие стандарту.

иногда стандарт удивляет.. для меня остается загадкой зачем нужно было такое разрешать

К>Хочешь нестандартного поведения? ну-ну.

не то чтобы нестандартного поведения, просто предупреждение о возможном сайд-эффекте.
Re[3]: вложенные переменные-дубликаты
От: Юрий Жмеренецкий ICQ 380412032
Дата: 20.08.09 15:23
Оценка:
Здравствуйте, Аноним, Вы писали:

ЮЖ>>C:\temp>cl test.cpp /analyze

А>эх, но :

/analyze is only available in Enterprise (team development) versions for x86 compilers.

А>может тогда в GCC есть что-то?

О наличии подобных опциий в GCC мне ничего не известно...
Re: вложенные переменные-дубликаты
От: Alexey F  
Дата: 20.08.09 16:07
Оценка: 7 (1)
Здравствуйте, Аноним, Вы писали:

А>Подскажите пожалуйста можно ли заставить компилятор (VC, GCC) хотя бы ругаться при повторном объявлении функции во вложенной области видимости:

Вот (из мануала по gcc 4.3.2):

-Wshadow Warn whenever a local variable shadows another local variable, parameter or
global variable or whenever a built-in function is shadowed.


На код:
#include <cstdio>

void foo()
{
    int a = 5;
    {
        int a;
        a = 3;
    }
    printf( "%d\n", a ); // выдаст естественно "5"
}

int main () {}

будет ругаться так:

main.cpp: In function 'void foo()':
main.cpp:7: warning: declaration of 'a' shadows a previous local
main.cpp:5: warning: shadowed declaration is here


А возможность эта существует, например, для таких вещей:
int index = 0;
// ...
for ( std::size_t index = 0; index < something; ++index ) { ... }


Re: вложенные переменные-дубликаты
От: Шахтер Интернет  
Дата: 20.08.09 16:14
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Подскажите пожалуйста можно ли заставить компилятор (VC, GCC) хотя бы ругаться при повторном объявлении функции во вложенной области видимости:

А>
void foo()
А>{
А>    int a = 5;
А>    {
А>        int a;
А>        a = 3;
А>    }
А>    printf( "%d\n", a ); // выдаст естественно "5"
А>}

А>Можно ли избавиться от этой мега-фичи опциями компилятора или хотя бы чтобы он предупреждал о возможной проблеме?

Проще и продуктивней начать учиться программировать. Данное свойство языка проистекает из принципа локальности: для понимания фрагмента кода в идеале не должны требоваться декларации за пределами этого фрагмента.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[2]: вложенные переменные-дубликаты
От: Аноним  
Дата: 20.08.09 16:15
Оценка:
AF>Вот (из мануала по gcc 4.3.2):
спасибо

AF>А возможность эта существует, например, для таких вещей:

AF>
AF>int index = 0;
AF>// ...
AF>for ( std::size_t index = 0; index < something; ++index ) { ... }
AF>

IMHO сомнительная возможность
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.