Подскажите пожалуйста можно ли заставить компилятор (VC, GCC) хотя бы ругаться при повторном объявлении функции во вложенной области видимости:
void foo()
{
int a = 5;
{
int a;
a = 3;
}
printf( "%d\n", a ); // выдаст естественно "5"
}
Можно ли избавиться от этой мега-фичи опциями компилятора или хотя бы чтобы он предупреждал о возможной проблеме?
Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста можно ли заставить компилятор (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
ЮЖ>C:\temp>cl test.cpp /analyze
эх, но
:
/analyze is only available in Enterprise (team development) versions for x86 compilers.
может тогда в GCC есть что-то?
Здравствуйте, <Аноним>, Вы писали:
А>Подскажите пожалуйста можно ли заставить компилятор (VC, GCC) хотя бы ругаться при повторном объявлении функции во вложенной области видимости:
Это, вообще-то, соответствие стандарту.
Хочешь нестандартного поведения? ну-ну.
А>Можно ли избавиться от этой мега-фичи опциями компилятора или хотя бы чтобы он предупреждал о возможной проблеме?
Статические анализаторы кода. Всякие там lint-ы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Здравствуйте, Кодт, Вы писали:
К>Это, вообще-то, соответствие стандарту.
иногда стандарт удивляет.. для меня остается загадкой зачем нужно было такое разрешать
К>Хочешь нестандартного поведения? ну-ну.
не то чтобы нестандартного поведения, просто предупреждение о возможном сайд-эффекте.
Здравствуйте, Аноним, Вы писали:
ЮЖ>>C:\temp>cl test.cpp /analyze
А>эх, но : /analyze is only available in Enterprise (team development) versions for x86 compilers.
А>может тогда в GCC есть что-то?
О наличии подобных опциий в GCC мне ничего не известно...
Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста можно ли заставить компилятор (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 ) { ... }
Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста можно ли заставить компилятор (VC, GCC) хотя бы ругаться при повторном объявлении функции во вложенной области видимости:
А>void foo()
А>{
А> int a = 5;
А> {
А> int a;
А> a = 3;
А> }
А> printf( "%d\n", a ); // выдаст естественно "5"
А>}
А>Можно ли избавиться от этой мега-фичи опциями компилятора или хотя бы чтобы он предупреждал о возможной проблеме?
Проще и продуктивней начать учиться программировать. Данное свойство языка проистекает из принципа локальности: для понимания фрагмента кода в идеале не должны требоваться декларации за пределами этого фрагмента.
AF>Вот (из мануала по gcc 4.3.2):
спасибо
AF>А возможность эта существует, например, для таких вещей:
AF>AF>int index = 0;
AF>// ...
AF>for ( std::size_t index = 0; index < something; ++index ) { ... }
AF>
IMHO сомнительная возможность