2012-07-20 10 views
35

Ho questo snippet di codice preso da un esempio scaricato:Come un gruppo di errore di croci di inizializzazione

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; 
} 

Ora, se compilare il programma ottengo questo errore:

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 

Ora, se rimosso il staffe di case statment ottengo questo errore:

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. 

Il codice sorgente completo di 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) Sto usando le staffe in modo errato?

2) Perché l'utilizzo delle parentesi nell'istruzione case mostra crosses initialization in altre righe di codice.

+2

Sei sicuro di aver pubblicato il codice corretto? Perché i messaggi di errore si lamentano (tra le altre cose) dell''inizializzazione di 'MessageEvent * me'', e non c'è alcuna variabile 'me' in nessun punto del codice postato? –

+1

@JoachimPileborg Sembra che la classe 'MessageEvent * me' si trovi in ​​un altro file. Grazie per avermi notato. – SIFE

+0

Possibile duplicato di [Errore: vai all'etichetta del caso] (http://stackoverflow.com/questions/5685471/error-jump-to-case-label) –

risposta

80

Lo standard C++ dice:

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.

I casi in switch sono considerati come un "salto".

Basta inserire tutte le inizializzazioni di oggetti e variabili prima dell'interruttore e tutto andrà bene.

consideri questo codice:

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

causerà una "attraversa inizializzazione" errore in quanto è possibile evitare l'inizializzazione di t, ma dopo che sarà ancora essere visibile, benché non è mai stato creato in primo luogo.

Ora considerare questo:

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

Qui, si non avere l'errore, perché la variabile è all'interno di un blocco, e morirà alla fine del blocco (alla chiusura {), quindi dopo questo sarà non essere in ambito in ogni caso.

Per fissare il primo caso, basta fare:

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

Perchè porting di qualche vecchio codice da C a C++, con un sacco di goto di (all'errore uscite). Questo problema si pone anche al di fuori delle istruzioni switch.

mio semplice work-around per gcc/g ++ (testato con v4.6 braccio-linux-androideabi-gcc):

se avete

goto err_exit; 
int a = 1; 

si lamenta.

Aggiungi -fpermissive alla riga di comando, e il sostituto:

goto err_exit; 
int a; 
a = 1; 

lamentele.

+0

yea g ++ goto logic è buggato – Lazik

Problemi correlati