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