Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1514111
  • 博文数量: 290
  • 博客积分: 3468
  • 博客等级: 中校
  • 技术积分: 3461
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-28 22:21
文章分类

全部博文(290)

文章存档

2016年(13)

2015年(3)

2014年(42)

2013年(67)

2012年(90)

2011年(75)

分类: 嵌入式

2013-05-10 17:54:47



点击(此处)折叠或打开

  1. switch(id) {
  2.     case 0:
  3.         break;
  4.     case 1:
  5.         break;
  6.     case 2:
  7.         
  8.         m_rdpDialog = new rdpDialog();
  9.         m_rdpDialog->setModal(true);
  10.         this->m_rdp.append(m_rdpDialog);

  11.         QString userName("rdp_");
  12.         userName += QString::number(qrand() % 1000);
  13.         m_rdpDialog->setString(userName);

  14.         QStringList userInfo;
  15.         userInfo << "RDP";
  16.         userInfo.append(userName);
  17.         userInfo << "192.168.2.100" << "auto";
  18.         this->slotAddContect(userInfo);

  19.         m_rdpDialog->show();
  20.         break;
  21.         
  22.     case 3:
  23.         break;
  24.     default:
  25.         break;
  26.     }

编译出错信息:
p, li { white-space: pre-wrap; }

loginWidget.cpp: In member function ‘void loginWidget::slotBtnClicked(int)’:

loginWidget.cpp:242: error: jump to case label

loginWidget.cpp:233: error: crosses initialization of ‘QStringList userInfo’

loginWidget.cpp:229: error: crosses initialization of ‘QString userName’

loginWidget.cpp:244: error: jump to case label

loginWidget.cpp:233: error: crosses initialization of ‘QStringList userInfo’

loginWidget.cpp:229: error: crosses initialization of ‘QString userName’

make: *** [loginWidget.o] Error 1

make: Leaving directory `/home/step_by_step/qt_exercise/login'

Exited with code 2.

Error while building project login

When executing build step 'Make'


原因是因为在C和C++中,一个变量的生命期(作用域)问题
这里的userInfo ,userName 的生命期为从 QString username, QStringList 开始到 switch 的 }结束
也就是说在 case 2 之后的 case 3 , default 中仍能访问 username ,useInfo .
考虑这样一种情况,如果switch匹配了case 3,这样case 2的代码被跳过了,那么username, userInfo就没有定义,如果此时在case 3的代码中访问了username, userInfo,程序会崩溃的。
所以上面的程序应写成如下方式


点击(此处)折叠或打开

  1. switch(id) {
  2.     case 0:
  3.         break;
  4.     case 1:
  5.         break;
  6.     case 2:
  7.         {
  8.         m_rdpDialog = new rdpDialog();
  9.         m_rdpDialog->setModal(true);
  10.         this->m_rdp.append(m_rdpDialog);

  11.         QString userName("rdp_");
  12.         userName += QString::number(qrand() % 1000);
  13.         m_rdpDialog->setString(userName);

  14.         QStringList userInfo;
  15.         userInfo << "RDP";
  16.         userInfo.append(userName);
  17.         userInfo << "192.168.2.100" << "auto";
  18.         this->slotAddContect(userInfo);

  19.         m_rdpDialog->show();
  20.         break;
  21.         }
  22.     case 3:
  23.         break;
  24.     default:
  25.         break;
  26.     }


参考链接:http://zhubangbing.blog.163.com/blog/static/526092702011931821900/






阅读(3495) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~