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 ...
随机推荐
- Entity Framework 与ORACLE ODP.Net 在vs2010下的稀奇古怪的问题
不说废话 1.在vs2010数据源中看不到oracle odp.net 数据源,vs2008下可以看到,通过oraprocfg配置多次,重启多次,还是看不到,machine.config里面配置也正常 ...
- HDU 3879 Base Station(最大权闭合子图)
经典例题,好像说可以转化成maxflow(n,n+m),暂时只可以勉强理解maxflow(n+m,n+m)的做法. 题意:输入n个点,m条边的无向图.点权为负,边权为正,点权为代价,边权为获益,输出最 ...
- LeetCode 88 Merge Sorted Array
Problem: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array ...
- hibernate中HQL多对多的查询
现有三张表 TLXPURCHASE.采购事项审批表,TLXPURCHASEACTIVITY.采购招标活动对应表,TLXACTIVITY.招标活动表,采购事项审批表和采购活动表是多对多关系.java中定 ...
- iOS 设置非ARC类
用-fno-objc-arc标记来禁用在ARC工程那些不支持ARC的文件的ARC用-fobjc-arc标记启用非ARC工程中支持ARC的文件
- 《BuildingMachineLearningSystemsWithPython》学习笔记
BuildingMachineLearningSystemsWithPython Python机器学习入门 数据分析五个步骤 读取和清洗数据 探索和理解输入数据[我的理解是业务理解] 分析如何将算法应 ...
- oracle数据库创建后要做的事情
在SQL Plus工具中(oracle自带)用conn /as sysdba登录数据库. 一:先新建用户 create user test01 identified by test02(test01为 ...
- SqlServer性能检测和优化工具使用详细(转)
转载链接:http://www.cnblogs.com/knowledgesea/p/3683505.html 工具概要 如果你的数据库应用系统中,存在有大量表,视图,索引,触发器,函数,存储过程,s ...
- Android 笔记 day2 拨号器
- Winform实现用多线程、百度地图API解析某公司的物理地址
前言 作为一个很挫的C#新手总喜欢自己写点儿不着边际的东西,本人是个新手加菜鸟,写B/S的,工作中,任务完成了,空闲下来,总想继续学点儿什么,由此触发了本篇文章了.个人一直认为,.NET中,C/S所要 ...