程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> fatal error C1061: 編譯器限制 : 塊嵌套太深,fatalc1061

fatal error C1061: 編譯器限制 : 塊嵌套太深,fatalc1061

編輯:C++入門知識

fatal error C1061: 編譯器限制 : 塊嵌套太深,fatalc1061


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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved