关于Symbian的"crosses initialization of XXX"错误

本文介绍了一种在编译过程中出现的crossesinitialization错误及其解决方案。此错误源于switch语句中变量作用域的问题,通过使用大括号限定变量作用域可以避免此错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   

          昨天,同事在把前一阶段的项目编译、打包成sis安装文件时,遇到如下的编译错误 :

crosses initialization of XXX

          同事向我请教,我仔细看了一下他的代码,并没有什么问题。这个错误提示很少见,于是Google了一下,找到如下一篇论坛上的资料:

Problem: You get an error of this form, while compiling some nice program from source:

Code:

error: jump to case label
error:   crosses initialization of `bool pushed'



The offending code contains a switch statement and a declaration of some variable or object inside one of its cases:

Code:

      case HD_ELEMENT_UL :
          bool pushed = t->style->margin[HD_POS_LEFT] != 0.0 ||
                        t->style->margin[HD_POS_RIGHT] != 0.0;

          if (pushed)
            margins->push(margins->left() + t->style->margin[HD_POS_LEFT],
                          margins->right() - t->style->margin[HD_POS_RIGHT],
                          margins->bottom(), 0);

          parse_contents(t->child, margins, y, page, heading, chap);

          if (pushed)
            margins->pop();
          break;


Idea Reason: The problem is that there is a declaration of an object (the boolean "pushed") without scope. Thus, the scope of the object could traverse the break statement and apply to the next case. Consider this - what is the scope of obj1 in the code below? It starts at the first label, and goes until the end of the case block. So it's in scope at CHOICE_B. But its constructor wasn't called....

Code:

  switch (choice) {
  case CHOICE_A:
    someclass obj1(&commonobj);

    break;
  case CHOICE_B:
    someotherclass obj2(&commonobj);

    break;
  default:
    break;
  }
}


Thus, you should use curly brackets to delimit scope, as in:

Code:

switch (choice) {
  case A: {
    someobj x;
    ...
  }
  break;
  case B: {
    ...
  }
  break;
  ...
}


Arrow Solution: Change the case statement to:

Code:

      case HD_ELEMENT_UL :
          {
          bool pushed = t->style->margin[HD_POS_LEFT] != 0.0 ||
                        t->style->margin[HD_POS_RIGHT] != 0.0;

          if (pushed)
            margins->push(margins->left() + t->style->margin[HD_POS_LEFT],
                          margins->right() - t->style->margin[HD_POS_RIGHT],
                          margins->bottom(), 0);
 
          parse_contents(t->child, margins, y, page, heading, chap);
   
          if (pushed)
            margins->pop();
          }
          break;



i.e. add curly brackets to delimit the scope of "pushed" inside the switch.

Exclamation References:

Bug#180937: g++ internal compiler error: Error reporting routines re-entered

Bug#180937: g++ internal compiler error: Error reporting routines re-entered
_________________
Regards

Chris Karakas
www.karakas-online.de

 

======================================================

注: 该资料的网址为:http://www.karakas-online.de/forum/viewtopic.php?t=4194

 

        原来如此!问题出在case语句内定义的变量的作用域上面。只要把每个case语句用括号(" {} ")括起来,变量的作用域限定在相应case语句之内,就不会出现交叉初始化(crosses initialization )的错误,问题随之解决。

       附:上面论坛资料的pdf格式文件的下载(我的box中的资源,版权归原论坛所有):

     

下载地址http://www.box.net/shared/ptpqtymqvz

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值