VisualStudio開發過程中碰到C1061報錯,查了MSDN,文檔說明如下 從說明中我們明白這是由於我們的代碼塊嵌套太深,超過了編譯器的限制。但我理解為應該是同一個域內塊的數量太多,超過了編譯器限制。示例代碼如下: Demo1 編譯報錯。 Demo2 編譯報錯。 Demo3 編譯通過。 Dem ...
VisualStudio開發過程中碰到C1061報錯,查了MSDN,文檔說明如下
從說明中我們明白這是由於我們的代碼塊嵌套太深,超過了編譯器的限制。但我理解為應該是同一個域內塊的數量太多,超過了編譯器限制。示例代碼如下:
void Demo1() { for( int i = 0; i < 10; ++i ) { cout << i << " "; } cout << endl; …重覆200個 for( int i = 0; i < 10; ++i ) { cout << i << " "; } cout << endl; } void Demo2() { int i =0; if( i == 1 ) { cout << i << endl; } else if( i == 2 ) { cout << i << endl; } …重覆200個 else if( i == 200 ) { cout << i << endl; } } void Demo3( int i ) { switch( i ) { case 0 : { cout << i << endl; } break; ..重覆200個 case 200: { cout << i << endl; } break; default: { cout << "unknown" << endl; } break; } } void Demo4() { for( int i = 0; i < 10; ++i ) cout << i << " "; …重覆200個 for( int i = 0; i < 10; ++i ) cout << i << " "; } void Demo5() { { for( int i= 0; i < 10; ++i ) { cout << i << " "; } cout << endl; } …重覆200個 { for( int i= 0; i < 10; ++i ) { cout << i << " "; } cout << endl; } }
Demo1
編譯報錯。
Demo2
編譯報錯。
Demo3
編譯通過。
Demo4
編譯報錯。
Demo4與Demo1的區別是少了for迴圈的大括弧。
Demo5
編譯通過。
Demo5和Demo1的區別是給每個for迴圈塊加上了一對大括弧。
實驗結果說明,代碼中塊的數量太多,會導致編譯器報錯。
解決方法
對於for迴圈塊這樣獨立的代碼塊,可以給每個代碼塊加上一對大括弧,這樣每個代碼塊就有了一個獨立的域。
對於if-else這樣的代碼,可以嘗試改成switch-case格式。
最好的辦法應該是將每個代碼塊封裝成類或函數調用,這樣可以簡化代碼的複雜度,也顯得更加優雅。
擴展
之前碰到一個問題,代碼如下:
if( condition) { do something } else if( condition) { if( condition) { CDemoClassdc; dosomething with dc } }
編譯死活報錯,將聲明dc那一行移到外面去就編譯通過:
if( condition) { do something } else if( condition) { CDemoClassdc; if( condition) { dosomething with dc } }
因為沒及時記錄,忘記報錯的內容了。個人猜測,這可能也跟塊嵌套太多有關係。
參考
https://msdn.microsoft.com/zh-cn/library/dcda4f64(v=vs.140).aspx
http://stackoverflow.com/questions/11508013/blocks-nested-too-deeply
http://stackoverflow.com/questions/4009923/c-fatal-error-c1061-with-large-switch-metaprogramming