2012-07-20 11 views
35

tengo esta fragmentos de código tomado de un ejemplo descargado:Conseguir un montón de errores cruces inicialización

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

Ahora bien, si compilar el programa me sale este error:

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 

Ahora si se retira la soportes de case DECLARACIÓN me sale este error:

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. 

El código fuente completo de 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) ¿Estoy usando soportes de forma incorrecta?

2) Por qué el uso de corchetes en la instrucción case muestra crosses initialization en otras líneas de código.

+2

¿Estás seguro de que has publicado el código correcto? Porque los mensajes de error se quejan (entre otras cosas) de 'inicialización de 'MessageEvent * me'', y no hay ninguna variable' me' en ningún lugar del código publicado. –

+1

@JoachimPileborg Parece que la clase 'MessageEvent * me' se encuentra en otro archivo. Gracias por verme – SIFE

+0

Posible duplicado de [Error: salte a la etiqueta de la caja] (http://stackoverflow.com/questions/5685471/error-jump-to-case-label) –

Respuesta

80

estándar de 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.

Los casos en switch se consideran como un "salto".

Simplemente ponga todas las inicializaciones de variables y objetos antes de su cambio, y todo estará bien.

Considere este código:

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

causará una "cruza la inicialización" error, ya que es posible saltar la inicialización de t, pero después de eso todavía será de alcance, aunque nunca fue creado en primer lugar.

ahora esto:

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

Aquí, se no tener el error, ya que la variable está dentro de un bloque, y morirá al final del bloque (al cierre {), entonces, después de eso, será no en cualquier caso.

Para solucionar el primer caso, sólo tiene que hacer:

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

Am portar algún viejo código de C a C++, con una gran cantidad de Goto de (a error salidas). Este problema también surge fuera de las instrucciones de cambio.

Mi solución alternativa simple para gcc/g ++ (probado con el brazo v4.6-linux-gcc-androideabi):

Si usted tiene

goto err_exit; 
int a = 1; 

se queja.

Añadir -fpermissive a la línea de comandos, y sustituir por:

goto err_exit; 
int a; 
a = 1; 

ninguna queja.

+0

sí g ++ goto logic está oculto – Lazik

Cuestiones relacionadas