2012-07-20 29 views
35

我有从下载的示例获取的代码,这个代码片段:入门十字架初始化错误的一堆

bool ChatServer::event(QEvent * event) 
{ 
    if(event->type() == QEvent::User) 
    { 
     UserEvent * ue = static_cast<UserEvent *>(event); 
     switch(ue->userType) 
     { 
      case CR::ErrorEvent: 
      case CR::LogEvent: 
      { 
       TraceEvent * te = static_cast<TraceEvent *>(ue); 
       if(te->userType == CR::ErrorEvent) 
       { 
        error(te->msg); 
       } 
       else 
       { 
        log(te->msg); 
       } 
      } 
       break; 
      default: 
       return false; 
     } 
    } 
    else 
    { 
     return QTcpServer::event(event); 
    } 
    return true; 
} 

现在,如果编译的程序中,我得到这个错误:

g++ -c -pipe -O2 -Wall -W -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/share/qt4/mkspecs/freebsd-g++ -I. -I/usr/local/include/qt4/QtCore -I/usr/local/include/qt4/QtNetwork -I/usr/local/include/qt4 -I. -I/usr/local/include/qt4 -I/usr/local/include -o chatserver.o chatserver.cpp 
g++ -c -pipe -O2 -Wall -W -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/share/qt4/mkspecs/freebsd-g++ -I. -I/usr/local/include/qt4/QtCore -I/usr/local/include/qt4/QtNetwork -I/usr/local/include/qt4 -I. -I/usr/local/include/qt4 -I/usr/local/include -o clientservice.o clientservice.cpp 
clientservice.cpp: In member function 'virtual bool ClientService::event(QEvent*)': 
clientservice.cpp:37: error: jump to case label 
clientservice.cpp:34: error: crosses initialization of 'MessageEvent* me' 
clientservice.cpp:41: error: jump to case label 
clientservice.cpp:38: error: crosses initialization of 'UserInfoEvent* uie' 
clientservice.cpp:34: error: crosses initialization of 'MessageEvent* me' 
clientservice.cpp:44: error: jump to case label 
clientservice.cpp:38: error: crosses initialization of 'UserInfoEvent* uie' 
clientservice.cpp:34: error: crosses initialization of 'MessageEvent* me' 
clientservice.cpp:31: warning: enumeration value 'EventTypeBegin' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'LogEvent' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'ErrorEvent' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'ClientConnected' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'ClientReg' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'ClientDisconnect' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'ServerConnected' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'ServerDisconnect' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'DoConnect' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'DoDisconnect' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'GotMessage' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'GotUserInfo' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'SendUserInfo' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'GotClientInfo' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'SendClientInfo' not handled in switch 
clientservice.cpp:31: warning: enumeration value 'EventTypeEnd' not handled in switch 
clientservice.cpp: In member function 'void ClientService::readClient()': 
clientservice.cpp:63: warning: comparison between signed and unsigned integer expressions 
clientservice.cpp:87: error: jump to case label 
clientservice.cpp:83: error: crosses initialization of 'Message* msg' 
clientservice.cpp:92: error: jump to case label 
clientservice.cpp:88: error: crosses initialization of 'UserInfo* ui' 
clientservice.cpp:83: error: crosses initialization of 'Message* msg' 
clientservice.cpp:97: error: jump to case label 
clientservice.cpp:93: error: crosses initialization of 'ClientInfo* ci' 
clientservice.cpp:88: error: crosses initialization of 'UserInfo* ui' 
clientservice.cpp:83: error: crosses initialization of 'Message* msg' 
clientservice.cpp: In member function 'bool ClientService::sendToClient(CR::MsgType::MsgType, SendAble*)': 
clientservice.cpp:124: warning: comparison of unsigned expression < 0 is always false 
clientservice.cpp: In member function 'void ClientService::gotUserInfo(UserInfo*)': 
clientservice.cpp:176: error: cast from 'ClientService*' to 'quint32' loses precision 
*** Error code 1 

Stop in ~/SimpleChatRoomServer 

现在,如果去除括号内的case的说明我得到这个错误:

g++ -c -pipe -O2 -Wall -W -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/share/qt4/mkspecs/freebsd-g++ -I. -I/usr/local/include/qt4/QtCore -I/usr/local/include/qt4/QtNetwork -I/usr/local/include/qt4 -I. -I/usr/local/include/qt4 -I/usr/local/include -o chatserver.o chatserver.cpp 
chatserver.cpp: In member function 'virtual bool ChatServer::event(QEvent*)': 
chatserver.cpp:108: error: jump to case label 
chatserver.cpp:98: error: crosses initialization of 'TraceEvent* te' 
chatserver.cpp:94: warning: enumeration value 'EventTypeBegin' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'ClientConnected' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'ClientReg' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'ClientDisconnect' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'ServerConnected' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'ServerDisconnect' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'DoConnect' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'DoDisconnect' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'GotMessage' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'SendMessage' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'GotUserInfo' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'SendUserInfo' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'GotClientInfo' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'SendClientInfo' not handled in switch 
chatserver.cpp:94: warning: enumeration value 'EventTypeEnd' not handled in switch 
*** Error code 1 

Stop in ~/SimpleChatRoomServer. 

完整的源代码SimpleChatRoomServer.cpp

#include <QTextStream> 
#include <QDateTime> 
#include "traceevent.h" 
#include "chatserver.h" 
#include "chatcenterthread.h" 
#include "clientservicethread.h" 
#include "message.h" 
#include "server.h" 

ChatServer::ChatServer(QObject * parent) 
     :QTcpServer(parent) 
{ 
    QFile * inFile = new QFile(this); 
    QFile * outFile = new QFile(this); 
    QFile * errFile = new QFile(this); 
    inFile->open(stdin,QIODevice::ReadOnly); 
    outFile->open(stdout,QIODevice::WriteOnly); 
    errFile->open(stderr,QIODevice::WriteOnly); 
    setIO(inFile,outFile,errFile); 

    qobject_cast<Server *>(qApp)->csrId = this; 
    csrId = (QObject *)(0+CR::ServerId); 
} 

ChatServer::~ChatServer() 
{ 
    for(int i = 0; i < ccs.size(); i++) 
    { 
     ccs.at(i)->deleteLater(); 
    } 
} 

void ChatServer::setIO(QFile * inFile,QFile * outFile,QFile * errFile) 
{ 
    in.setDevice(inFile); 
    out.setDevice(outFile); 
    err.setDevice(errFile); 
} 

void ChatServer::incomingConnection(int socketId) 
{ 
    ClientServiceThread *cst = new ClientServiceThread(socketId,this); 
    cst->start(); 
    connect(cst,SIGNAL(finished()),cst,SLOT(deleteLater())); 
} 

bool ChatServer::init(quint16 & port) 
{ 
    if(!port) 
    { 
     bool ok = false; 
     while(!ok) 
     { 
      out<<tr("Port[5555]: "); 
      out.flush(); 
      QString p; 
      p = in.read(1); 
      if(p!=QString("\n")) 
      { 
       QString strport; 
       strport = in.readLine(10); 
       strport = p + strport; 
       port = strport.toUInt(&ok); 
      } 
      else 
      { 
       port = 5555; 
       ok = true; 
      } 
     } 
    } 

    //ADD ONE ChatCenter 
    ChatCenterThread * cct = new ChatCenterThread(this); 
    cct->start(); 
    connect(cct,SIGNAL(finished()),cct,SLOT(deleteLater())); 

    if(!listen(QHostAddress::Any,port)) 
    { 
     error(tr("Listen at [%1] fail!").arg(port)); 
     deleteLater(); 
     exit(1); 
     return false; 
    } 
    log(tr("Listen at [%1]").arg(port)); 
    return true; 
} 

bool ChatServer::event(QEvent * event) 
{ 
    if(event->type() == QEvent::User) 
    { 
     UserEvent * ue = static_cast<UserEvent *>(event); 
     switch(ue->userType) 
     { 
      case CR::ErrorEvent: 
      case CR::LogEvent: 
       TraceEvent * te = static_cast<TraceEvent *>(ue); 
       if(te->userType == CR::ErrorEvent) 
       { 
        error(te->msg); 
       } 
       else 
       { 
        log(te->msg); 
       } 
       break; 
      default: 
       return false; 
     } 
    } 
    else 
    { 
     return QTcpServer::event(event); 
    } 
    return true; 
} 

void ChatServer::error(QString msg) 
{ 
    err<<QDateTime::currentDateTime().toString(Qt::ISODate) 
      <<" !ERROR! "<<msg<<endl; 
} 

void ChatServer::log(QString msg) 
{ 
    out<<QDateTime::currentDateTime().toString(Qt::ISODate) 
      <<" "<<msg<<endl; 
} 

1)我是否正确使用括号?

2)为什么在case语句中使用括号会显示crosses initialization到其他代码行。

+2

你确定你已经发布了正确的代码吗?由于错误消息会抱怨(其中包括)'MessageEvent * me''的初始化,并且发布代码中的任何地方都没有'me'变量? – 2012-07-20 12:31:09

+1

@JoachimPileborg看起来像'MessageEvent * me'类位于另一个文件中。谢谢你注意到我。 – SIFE 2012-07-20 12:55:24

+0

可能重复的[错误:跳转到案例标签](http://stackoverflow.com/questions/5685471/error-jump-to-case-label) – 2016-03-02 20:24:33

回答

80

的C++标准说:

It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer.

switch的情况下,被认为是一个 “跳”。

只需在切换之前放置所有对象和变量初始化,一切都会好的。

考虑以下代码:

switch(k) 
{ 
    case 1: 
     int t = 4; 
    break; 
    default: 
    break; 
} 

它会导致“穿越初始化”的错误,因为它可以跳过T的初始化,但之后仍将在规模,即使它从来没有创造过。

现在考虑这个:

switch(k) 
{ 
    case 1: 
    { 
     int t = 4; 
    } 
    break; 
    default: 
    break; 
} 

在这里,你会有错误,因为变量是块内,并且将在块的结尾死(在闭幕式{)所以在此之后,它将而不是在任何情况下在范围内。

要解决第一种情况下,你只需要做:

int t = 0; 
switch(k) 
{ 
    case 1: 
     t = 4; 
    break; 
    default: 
    break; 
} 
4

上午在C移植一些旧代码,C++,有很多goto语句的(错误退出)的。 此问题也出现在switch语句之外。

我简单的变通为GCC/G ++(与ARM-Linux的androideabi-GCC V4.6测试):

如果你有

goto err_exit; 
int a = 1; 

它抱怨。

添加-fpermissive到命令行,并替代:

goto err_exit; 
int a; 
a = 1; 

没有怨言。

+0

是啊g ++ goto逻辑被窃听 – Lazik 2015-06-18 07:53:46