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

fatal error C1061: 编译器限制 : 块嵌套太深的更多相关文章

  1. fatal error C1045: 编译器限制 : 链接规范嵌套太深

    前言 我相信你是遇到了同样的问题.通过搜索引擎来到这里的.为了不耽误排查问题的时间,我提前说明一下这篇文章所描述的问题范畴: 我遇到的问题和 c++ 模板相关: 如果我减少传递的参数的话,是有可能避免 ...

  2. fatal error c1001 编译器中发生内部错误 OpenMesh6.3

    Internal Compiler Error VS 2015 Update1 VS2015 Update1 编译OpenMesh的额代码时发生错误 fatal error c1001 编译器中发生内 ...

  3. 【VS开发】fatal error C1001:编译器中发生内部错误

    自己编译boost的库文件时遇到这个错误的,大概报错情况如下:  mp_defer.hpp<50>:fatal error C1001:编译器中发生内部错误.  1> 要解决此问题, ...

  4. Avoid nesting too deeply and return early避免嵌套太深应尽早返回

    当某个变量与多个值进行比较的时候 不要用多个if else 判断是否相等 将多个值放在数组里,然后用PHP函数in_array(mixed $needle,array $haystack),检查数组$ ...

  5. VS中c++文件调用c 函数 ,fatal error C1853 预编译头文件来自编译器的早期版本号,或者预编译头为 C++ 而在 C 中使用它(或相反)

    出现错误:error C1853: "Debug\ConsoleApplication1.pch"预编译头文件来自编译器的早期版本号.或者预编译头为 C++ 而在 C 中使用它(或 ...

  6. 【VS开发】fatal error C1853: "Debug\sift.pch"预编译头文件来自编译器的早期版本

    fatal error C1853: "Debug\sift.pch"预编译头文件来自编译器的早期版本 <pre id="best-content-12991040 ...

  7. fatal error C1047: 对象或库文件“.\x64\Release\Des.obj”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库

    问题描述: 在把一个32位的dll编译成64位的时候提示上面的错误 解决办法: >属性->常规->项目默认值->全程序优化  将这里的默认项 "使用链接时间代码生成& ...

  8. C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous

    转载:https://www.cnblogs.com/emanlee/archive/2010/10/16/1852998.html 用VC++ 2008 编写C语言程序,编译出现错误: 预编译头文件 ...

  9. 完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错

    我的开发环境是Win7旗舰64位+VS2003.Net,经常卡pdb错误,文末给出一个完美的解决方案和一个懒人补丁包.问题描述如下:在重新编译的时候,经常报错: fatal error LNK1201 ...

随机推荐

  1. JS中修改属性

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  2. SelectionSort,选择排序

    /**算法:选择排序1,从当前未排序的正数中找一个最小的整数,将它放在已排序的整数列表的最后2.要点:选择排序选最小的,往左边选*/ #include <stdio.h>void Sele ...

  3. JQuery简单标签页实现

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  4. execl表格VLOOKUP函数的使用

    使用场景:最近在处理一个表格数据的时候出现了一点麻烦.想把另外表2里面对应的的数据放到表1里面,本来表2的ID是乱序的(这里为好看,就顺序排了.),一个个查找复制粘贴比较麻烦,后经大师指点VLOOKU ...

  5. C/C++中无条件花括号的妙用

    C/C++中无条件花括号可以形成一个代码块,一个作用域.可以使括号内定义的变量就只在本域(就是这个大括号)内有效,而且不会影响其他域,即使名字相同. 在花括号内,如果变量前面带类型,则相当于新创建一个 ...

  6. 关于EF的一个简单Demo

       今天使用EF的时候很奇怪的问题,添加属性后,使用程序包管理器控制台的NuGet命令更新无效,于是做了这个测试,一次性写好,自动更新,看看效果 1.首先建立一个MVC项目 2.我们选择Intern ...

  7. Hadoop Linux安装

    Hadoop Linux安装 步骤流程 1.硬件准备 2.软件准备(推荐CDH) 3.将Hadoop安装包分发到各个节点下 4.安装JDK 5.修改/etc/hosts配置文件 6.设置SSH免密码登 ...

  8. jq switch case

    switch (cnt) {                    case ("string1"):                        ...             ...

  9. windows pip安装 更新

    升级: http://blog.csdn.net/liuchunming033/article/details/39578019 pip坏了如何重新安装: https://github.com/pyp ...

  10. linux系统ftp命令

    先来一段简单的ftp 下载脚本 ftp -i -n<<EOF open 14.2.33.211 user etl etl cd /etlfile/ftpfile lcd /etlfile/ ...