Zu viele nicht wiederholte Schleifen führen fälschlicherweise zu einem C1061-Compilerfehler in Visual C++.
Dieser Artikel hilft Ihnen bei der Behebung des C1061-Compilerfehlers, der beim Kompilieren des Quellcodes auftritt, der mehr als 250 nicht vereste Schleifen in einer Funktion als C++-Quelldatei enthält.
Originalversion des Produkts: Visual Studio Premium 2012, Visual Studio 2010
Ursprüngliche KB-Nummer: 315481
Problembeschreibung
Wenn eine Funktion mehr als ca. 250 ungestummte Schleifen enthält, wird die folgende Fehlermeldung angezeigt, die in diesem Szenario nicht angezeigt werden sollte:
Schwerwiegender Fehler C1061: Compilerlimit: Zu tief geschachtelte Blöcke
Das Problem tritt nur auf, wenn Sie den Quellcode als C++-Quelldatei kompilieren. Der Quellcode wird ohne Fehler kompiliert, wenn Sie ihn als C-Quelldatei kompilieren.
Problemumgehung
Schließen Sie jede for-Schleife mit Geschweiften ein, um einen umschließenden Bereich zu erstellen:
{
for (i=0; i<5; i++)
{
a += a*i;
}
}
Schritte zum Reproduzieren des Verhaltens
Der folgende Beispielcode veranschaulicht den Fehler:
/* Compile options needed: /TP /c
*/
#include <stdio.h>
// The code blocks in this function have only two nesting levels.
// C1061 should not occur.
void func1()
{
int a;
int i = 0;
int count = 0;
count++;
a = count;
for (i=0; i<5; i++)
{
a += a*i;
}
printf("a=%d\n", a);
// Copy and paste the following code 250 times.
/*
for (i=0; i<5; i++)
{
a += a*i;
}
printf("a=%d\n", a);
*/
count++;
a = count;
for (i=0; i<5; i++)
{
a += a*i;
}
printf("a=%d\n", a);
}
void main()
{
func1();
}
Weitere Informationen
Der C++-Compiler muss alle For-Loops im selben Bereich nachverfolgen, um eine Warnung zu C4258 ausstellen zu können, wenn /Zc:forScope aktiviert ist:
int i;
void foo()
{
for (int i = 0; i < 10; ++i)
{
if (i == 5) break;
}
if (i == 5)... // C4258: this 'i' comes from an outer scope, not the for-loop
}
Wenn /Zc:ForScope deaktiviert ist, würde dies i in der kommentierten Zeile stattdessen aus der For-Schleife stammen. Benutzer müssen über diesen Verhaltensunterschied informiert werden.
Leider sind Bereiche nicht triviale Datenstrukturen, sodass der Compiler eine Beschränkung der Anzahl von Bereichen hat, die er gleichzeitig nachverfolgen kann, was zu dem hier beschriebenen Fehler führt.
Die Problemumgehung löst dieses Problem, indem jede For-Schleife so isoliert wird, dass sie nicht mehr im selben Bereich wie andere For-Loops liegt, wodurch die Notwendigkeit des Compilers entfällt, alle Bereiche gleichzeitig nachzuverfolgen. Eine weitere Möglichkeit, die Problemumgehung zu betrachten, besteht darin, dass die Möglichkeit vermieden wird, eine Warnung für C4258 außerhalb eines zusätzlichen einschließenden Bereichs zu finden:
int i;
void foo()
{
{
for (int i = 0; i < 10; ++i)
{
if (i == 5) break;
}
}
if (i == 5)...
// this 'i' comes from the outer scope regardless of whether /Zc:forScope is enabled
}