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. 【sublime xftp插件】 Host key verification failed ,错误处理

    错误背景: 1.CentOS7上面作为运行环境,Coding在本机的windows环境 2.在windows上安装sublime 3,然后保存代码通过xftp保存到centos7虚机上面. 3.Cen ...

  2. yii框架中验证器声明一组内置验证器可以使用短名称引用

    1.内置验证器的短名称分别有: boolean: yii\validators\BooleanValidator captcha: yii\captcha\CaptchaValidator compa ...

  3. .NET LINQ 串联运算

    串联运算      串联是指将一个序列追加到另一个序列的运算. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 Concat 串联两个序列以组成一个序列. ...

  4. 模拟搭建Web项目的真实运行环境(一)

    序言 最近尝试完整搭建一个Web项目的运行环境,总结一下这几个月学到的知识点. 后面的文章主要包括一下几个内容: A. 搭建一个Linux服务器,用来部署Redis.Mongo等数据存储环境: B. ...

  5. 【使用Unity开发Windows Phone上的2D游戏】(2)初识工具

    下载工具 我们需要下载两个工具:Unity 和 2D Toolkit Unity 在我写这篇文章的时候,最新的Unity版本是4.2.1, 下载地址 Unity公司的开发效率实在是很高,我一个多月前开 ...

  6. 字符串的replace()方法隐藏着什么不可告人秘密?

    最近在做JS算法项目时发现一个令我匪夷所思的问题, 这里想记录一下问题. 首先介绍一下字符串replace()方法的基本用法. replace() 方法使用一个替换值(replacement)替换掉一 ...

  7. C++ 定义全局数组

    数组怎么用,全局数组就怎么用,只是他的作用域不一样才叫全局数组... 在A.h 或 A.cpp中定义char buf[10]; 如果在B.cpp要用,就在其开头中写成 extern char buf[ ...

  8. 利用WCF创建简单的RESTFul Service

    1):用VS2013创建一个WCF的工程,如下图所示: 2):我们来看一下默认状态下的config文件内容,这里的内容我们会再后续的步骤中进行修改 <?xml version="1.0 ...

  9. Js-知识小总结

    1.给标签价 class属性的时候,记住是 ClassName, 例如:var oImg = document.getElementById('img1'); 要给这个对象价class属性 oimg. ...

  10. iOS--UIScrollView图片动画切换【实现每次只加载3张图片,进而减少占用内存,可循环滚动】

    #import "ViewController.h" #define IMAGENUMBER 5 #define SIZE self.view.bounds.size @inter ...