fatal error C1061: 编译器限制 : 块嵌套太深
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: 编译器限制 : 块嵌套太深的更多相关文章
- fatal error C1045: 编译器限制 : 链接规范嵌套太深
前言 我相信你是遇到了同样的问题.通过搜索引擎来到这里的.为了不耽误排查问题的时间,我提前说明一下这篇文章所描述的问题范畴: 我遇到的问题和 c++ 模板相关: 如果我减少传递的参数的话,是有可能避免 ...
- fatal error c1001 编译器中发生内部错误 OpenMesh6.3
Internal Compiler Error VS 2015 Update1 VS2015 Update1 编译OpenMesh的额代码时发生错误 fatal error c1001 编译器中发生内 ...
- 【VS开发】fatal error C1001:编译器中发生内部错误
自己编译boost的库文件时遇到这个错误的,大概报错情况如下: mp_defer.hpp<50>:fatal error C1001:编译器中发生内部错误. 1> 要解决此问题, ...
- Avoid nesting too deeply and return early避免嵌套太深应尽早返回
当某个变量与多个值进行比较的时候 不要用多个if else 判断是否相等 将多个值放在数组里,然后用PHP函数in_array(mixed $needle,array $haystack),检查数组$ ...
- VS中c++文件调用c 函数 ,fatal error C1853 预编译头文件来自编译器的早期版本号,或者预编译头为 C++ 而在 C 中使用它(或相反)
出现错误:error C1853: "Debug\ConsoleApplication1.pch"预编译头文件来自编译器的早期版本号.或者预编译头为 C++ 而在 C 中使用它(或 ...
- 【VS开发】fatal error C1853: "Debug\sift.pch"预编译头文件来自编译器的早期版本
fatal error C1853: "Debug\sift.pch"预编译头文件来自编译器的早期版本 <pre id="best-content-12991040 ...
- fatal error C1047: 对象或库文件“.\x64\Release\Des.obj”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库
问题描述: 在把一个32位的dll编译成64位的时候提示上面的错误 解决办法: >属性->常规->项目默认值->全程序优化 将这里的默认项 "使用链接时间代码生成& ...
- 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语言程序,编译出现错误: 预编译头文件 ...
- 完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错
我的开发环境是Win7旗舰64位+VS2003.Net,经常卡pdb错误,文末给出一个完美的解决方案和一个懒人补丁包.问题描述如下:在重新编译的时候,经常报错: fatal error LNK1201 ...
随机推荐
- 【sublime xftp插件】 Host key verification failed ,错误处理
错误背景: 1.CentOS7上面作为运行环境,Coding在本机的windows环境 2.在windows上安装sublime 3,然后保存代码通过xftp保存到centos7虚机上面. 3.Cen ...
- yii框架中验证器声明一组内置验证器可以使用短名称引用
1.内置验证器的短名称分别有: boolean: yii\validators\BooleanValidator captcha: yii\captcha\CaptchaValidator compa ...
- .NET LINQ 串联运算
串联运算 串联是指将一个序列追加到另一个序列的运算. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 Concat 串联两个序列以组成一个序列. ...
- 模拟搭建Web项目的真实运行环境(一)
序言 最近尝试完整搭建一个Web项目的运行环境,总结一下这几个月学到的知识点. 后面的文章主要包括一下几个内容: A. 搭建一个Linux服务器,用来部署Redis.Mongo等数据存储环境: B. ...
- 【使用Unity开发Windows Phone上的2D游戏】(2)初识工具
下载工具 我们需要下载两个工具:Unity 和 2D Toolkit Unity 在我写这篇文章的时候,最新的Unity版本是4.2.1, 下载地址 Unity公司的开发效率实在是很高,我一个多月前开 ...
- 字符串的replace()方法隐藏着什么不可告人秘密?
最近在做JS算法项目时发现一个令我匪夷所思的问题, 这里想记录一下问题. 首先介绍一下字符串replace()方法的基本用法. replace() 方法使用一个替换值(replacement)替换掉一 ...
- C++ 定义全局数组
数组怎么用,全局数组就怎么用,只是他的作用域不一样才叫全局数组... 在A.h 或 A.cpp中定义char buf[10]; 如果在B.cpp要用,就在其开头中写成 extern char buf[ ...
- 利用WCF创建简单的RESTFul Service
1):用VS2013创建一个WCF的工程,如下图所示: 2):我们来看一下默认状态下的config文件内容,这里的内容我们会再后续的步骤中进行修改 <?xml version="1.0 ...
- Js-知识小总结
1.给标签价 class属性的时候,记住是 ClassName, 例如:var oImg = document.getElementById('img1'); 要给这个对象价class属性 oimg. ...
- iOS--UIScrollView图片动画切换【实现每次只加载3张图片,进而减少占用内存,可循环滚动】
#import "ViewController.h" #define IMAGENUMBER 5 #define SIZE self.view.bounds.size @inter ...