Re: Erroneous for-loop variable used with /Zc:forScope

Tech-Archive recommends: Fix windows errors by optimizing your registry



Up to some version of VC they used the older standard for
"for" scope by default. It's changed by a compiler option:
"Force Conformance In For Loop Scope" in the Language
subitem of C/C++ options in your project (at least that's
where it is in my VC 7.1). Set that to Yes to get standard
behavior.

Note, this is a feature, not a bug :)...

--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@xxxxxxxx
MVP VC FAQ: http://vcfaq.mvps.org
=====================================

"Felipe" <felipe.m.almeida@xxxxxxxxx> wrote in message
news:1187604012.093458.202200@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Even with /Zc:forScope used, Compiling this code with Visual C++
Express 2005 tells me he is using the i from the most nested for-loop,
which is wrong! And gives an error for not having a assignment
operator. Proving is trying to use the i from the nested for-loop.
This compiles fine on Visual C++ 7.1 (2003) Professional and Visual C+
+ Express 9.0 Beta 2.

int main()
{
struct A {
A& operator++();
bool operator!=(int) const;
//A& operator=(int);
};
for(int i = 0; i < 10; i++)
{
for(A i; i != 20; ++i)
{

}

i = 5;
}
}

The error message:

subprojects\misvc\src\tnef_conversion.cpp(322) : warning C4822:
'try_convert_from_rfc2822::A::operator ++' : local class member
function does not have a body
subprojects\misvc\src\tnef_conversion.cpp(323) : warning C4822:
'try_convert_from_rfc2822::A::operator !=' : local class member
function does not have a body
subprojects\misvc\src\tnef_conversion.cpp(333) : warning C4288:
nonstandard extension used : 'i' : loop control variable declared in
the for-loop is used outside the for-loop scope; it conflicts with the
declaration in the outer scope
subprojects\misvc\src\tnef_conversion.cpp(328) : definition of
'i' used
subprojects\misvc\src\tnef_conversion.cpp(326) : definition of
'i' ignored
subprojects\misvc\src\tnef_conversion.cpp(333) : error C2679: binary
'=' : no operator found which takes a right-hand operand of type
'int' (or there is no acceptable conversion)



.



Relevant Pages

  • Re: Erroneous for-loop variable used with /Zc:forScope
    ... Proving is trying to use the i from the nested for-loop. ... the for-loop is used outside the for-loop scope; ... That's not a program, or even a legal fragment, because member functions of ...
    (microsoft.public.vc.language)
  • Re: About String
    ... My idea is that every statement list is a scope. ... You declare something inside a loop body, ... The same sense as declare blocks. ... SCOPE [DECLS] STATEMENTS END-SCOPE ...
    (comp.lang.ada)
  • Re: Which scope for variables being used in a loop?
    ... can't be GC'd until the scope they are declared in exist. ... inside of the loop. ... overlay local allocations in another loop. ... declaration itself, such that the pointer-value of the variable is ...
    (comp.lang.java.programmer)
  • Re: Scope Best Practice
    ... creating a new object versus the cost of maintaining it in memory?" ... the object is ready for GC once the loop is complete ( ... even if it remains in scope because it is not being referenced anywhere ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Dereferencing Hash of Arrays
    ... I guess it has the opposite effect. ... is to always declare variables in the shortest scope possible. ... Change that while loop to: ... iteration begins, %data will be destroyed and your next iteration will ...
    (comp.lang.perl.misc)