fatal error C1061: compiler limit : blocks nested too deeply 原因以及解决办法

社会主义新天地 提交于 2020-02-05 09:32:29


写在前面的话:
  续接上次的ASN.1继续更新,这是项目文件在编译时候遇到的错误,现在总结一下

一.问题描述

在xx.cpp的项目文件中,需要在原来的else if架构中再添加一行该结构来匹配字符串,但是在编译时候出现fatal error C1061错误。

二.原因

上网查询后得知是C和C++编译器最大仅支持128层的代码块嵌套,微软Visual C++给出的解释如下1

Nesting of code blocks exceeds the limit of 128 nesting levels. This is a hard limit in the compiler for both C and C++, in both the 32-bit and 64-bit tool set. The count of nesting levels can be increased by anything that creates a scope or block. For example, namespaces, using directives, preprocessor expansions, template expansion, exception handling, loop constructs, and else-if clauses can all increase the nesting level seen by the compiler.

三.解决办法

不同代码导致的问题解决办法不尽相同。但是最根本的是要重构代码,减少代码嵌套级别以提高代码质量并简化维护。下面是几种常用的解决办法:

1.将深层嵌套的代码分解为从原始上下文调用的函数

Eg:
your code

void foo()
{
	if (cond1)
	{
 	   if ( cond2)
 	   {
      	  if (cond3)
  	   }
    }
	else
	{;}
}

alternative code

RESULT funcForCond1( ARGS)
{
   if ( cond2)
   {
       funcForCond2();
   }
}
RESULT funcForCond2( ARGS)
{
   if ( cond3)
   {
       //...
   }
}
void foo()
{
  if( cond1)
       funcForCond1()
  else
  {;}     
}

这种方法有点换汤不换药的意思,没有从代码的结构上去解决问题。如果遇到比较复杂的问题,这么改会很头大。下面说一种易于维护、代码结构良好的方法

2.面向对象的方法

利用面向对象的方法限制或消除块中循环或链接的else-if子句的数量。不同的情况处理方式不一样,现在说一下由于else if导致出现错误的情况。在这里,一般用C++自带的哈希映射去替代else if中的数据流匹配问题。在这里剖一个stack overflow的链接2,大家参考一下.

3.利用switch替换

switch的case标签不会被编译器识别当作块嵌套,可以替换else if导致的问题。

四.参考文献

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!