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 ...
随机推荐
- Could not instantiate bean class [java.util.List]: Specified class is an interface] with root cause
最近项目中页面比较复杂,springMVC传参过程中遇到这样一个错误:Could not instantiate bean class [java.util.List]: Specified clas ...
- 【python】确保文件写入结束
今天遇到了个问题: 我在执行如下代码时发现,文件只写了一半.也就是说,当文件量过大时,下面的代码是不能保证文件被正确写入的. fd = open('test.txt','w') fd.write(&q ...
- 使用原生ajax访问后台数据并将其展现在前端页面中(小菜鸟自己整理玩的,大神勿喷)
首先你要有php的环境,关于php环境的搭建,php本地站点的搭建,此处不再重复请看这里:http://www.cnblogs.com/Gabriel-Wei/p/5950465.html我们把wam ...
- TCP协议三次握手和四次挥手
http://www.cnblogs.com/rootq/articles/1377355.html TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对 ...
- CLR VIA C# 学习笔记
第19章 可空类型 1)使用Nullable<T>可将int32的值类型设置为Null,CLR会在Null时默认赋值为0; 如:Nullable<T> x=null; //使用 ...
- CozyRSS开发记录3-标题栏再加强
CozyRSS开发记录3-标题栏再加强 1.更精炼的标题栏 接下来,我们把窗口的边框和默认的标题栏给去掉,让Cozy看起来更像一个平板应用. 在主窗口的属性里,修改下列两个属性: 效果一目了然: 2. ...
- 对LR关联的一些理解
从接触LR关联的迷茫,到现在略有感悟,小记期间的一些理解. 一开始认识关联是在LR自带学习例子,需要关联session,也知道了自动关联,手动关联以及边录制边关联. 在使用关联的过程中,也学习了web ...
- Spring整合web开发
正常整合Servlet和Spring没有问题的 public class UserServlet extends HttpServlet { public void doGet(HttpServlet ...
- Codeforces Round #367 (Div. 2)
A题 Beru-taxi 随便搞搞.. #include <cstdio> #include <cmath> using namespace std; int a,b,n; s ...
- 【Oracle】oracle利用正则表达式拆分IP地址
使用oracle提供的regexp_substr()函数,对将IPV4地址分成4段: select v.ip as ip_address, regexp_substr(v.ip,,) as A, re ...