免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3615 | 回复: 13
打印 上一主题 下一主题

一个比较莫名其妙的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-29 14:28 |只看该作者 |倒序浏览

void commmandWork(char* cmdChar)
{
    BASE_COMMAND* cmd = (BASE_COMMAND*)cmdChar;
    DWORD cmdType = cmd->cmdType;
    switch(cmdType)
    {
        case LOGOUT:
            printf("Fuck you!");
            break;
        case LOGIN:
            LOGIN_COMMAND* loginCmd = (LOGIN_COMMAND*)cmd;
            printf("the login name is %s\n", loginCmd->mLoginName);
            printf("the login password is %s\n", loginCmd->mPassword);
            printf("shi");
            break;
        default:
            printf("sdf");
    }

}



竟然报错,以下是报错的信息。请教各位大虾:
Compiling...
MsgQueue.cpp
E:\workspace\MsgQueue\MsgQueue.cpp(27) : error C2361: initialization of 'loginCmd' is skipped by 'default' label
        E:\workspace\MsgQueue\MsgQueue.cpp(22) : see declaration of 'loginCmd'
Error executing cl.exe.

MsgQueue.exe - 1 error(s), 0 warning(s)

论坛徽章:
0
2 [报告]
发表于 2009-04-29 14:46 |只看该作者
往前移!

论坛徽章:
0
3 [报告]
发表于 2009-04-29 14:55 |只看该作者

回复 #2 langue 的帖子

把         LOGIN_COMMAND* loginCmd = (LOGIN_COMMAND*)cmd; 放到switch的前面是解决了。能否请教是为什么啊?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2009-04-29 15:08 |只看该作者
MSDN的说法:
Compiler Error C2361
initialization of 'identifier' is skipped by 'default' label

The specified identifier initialization can be skipped in a switch statement.

It is illegal to jump past a declaration with an initializer unless the declaration is enclosed in a block.

The scope of the initialized variable lasts until the end of the switch statement unless it is declared in an enclosed block within the switch statement.

The following is an example of this error:

void func( void )
{
   int x;
   switch (x)
   {
   case 0 :
      int i = 1;       // error, skipped by default  
      { int j = 1; }   // OK, initialized in enclosing block
   default :
      int k = 1;       // OK, initialization not skipped
   }
}

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2009-04-29 15:08 |只看该作者
case LOGIN:
{
            LOGIN_COMMAND* loginCmd = (LOGIN_COMMAND*)cmd;
            printf("the login name is %s\n", loginCmd->mLoginName);
            printf("the login password is %s\n", loginCmd->mPassword);
            printf("shi");
}
            break;

论坛徽章:
0
6 [报告]
发表于 2009-04-29 15:15 |只看该作者

回复 #4 hellioncu 的帖子

兄台回复的正解。。。。。以前写switch也一直注意加{}的,今天没有注意,居然被报错。。。。又学到了。。呵呵。在swtich里初始化标识要加{}。。。

论坛徽章:
0
7 [报告]
发表于 2009-04-29 15:23 |只看该作者

回复 #4 hellioncu 的帖子

受教了!以前都是在开始初始化,没有遇到这样的问题!

论坛徽章:
0
8 [报告]
发表于 2009-04-29 17:13 |只看该作者
这个问题,呵呵,菜鸟给大家解释下:
在case的{}中或者在switch的前面声明变量是对的。

你假设不这样做,而是按照楼主给的例子写,那么当程序运行的时候,
前面两个case没匹配上的话,进入default执行。
那么这时候在default中能不能引用变量loginCmd呢?当然可以!因为这个default和前面的case是在一个语法块里面的。
这样问题就来了:你并没有定义loginCmd(因为实际运行时候没进入定义它的那个case),却在default中引用了它。
这时候编译器就知道你的代码有潜在错误:你可能会在default中使用loginCmd这个变量。

如果你没看懂我说的什么,没关系,c++ primer这本书的第三版上有很详细的解释。

论坛徽章:
0
9 [报告]
发表于 2009-04-29 17:41 |只看该作者
加上{}, 表示一个代码块, 在此代码块内声明的变量的作用域只在该代码块内.

论坛徽章:
0
10 [报告]
发表于 2009-04-29 17:50 |只看该作者
原帖由 youshuang 于 2009-4-29 17:13 发表
这个问题,呵呵,菜鸟给大家解释下:
在case的{}中或者在switch的前面声明变量是对的。

你假设不这样做,而是按照楼主给的例子写,那么当程序运行的时候,
前面两个case没匹配上的话,进入default执行。
...


但是LZ给的例子似乎没有在default处引用上面定义的变量吧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP