Getting a bunch of crosses initialization error
c++, g++, initialization, switch-statement
Solution
The C++ standard says:
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.
The cases in `switch` are considered as a "jump".
Just put all objects and variables initializations before your switch, and everything will be fine.
Consider this code:
switch(k)
{
case 1:
int t = 4;
break;
default:
break;
}
It will cause a "crosses initialization" error, because it is possible to skip the initialization of t, but after that it will still be in scope, even though it was never created in the first place.
Now consider this:
switch(k)
{
case 1:
{
int t = 4;
}
break;
default:
break;
}
Here, you will not have the error, because the variable is inside a block, and will die at the end of the block ( at the closing `{` ), so after that it will not be in scope in any case.
To fix the first case, you just need to do:
int t = 0;
switch(k)
{
case 1:
t = 4;
break;
default:
break;
}
Problem
I have this snippets of code taken from a downloaded example: ``` 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; } ``` Now if compile the program I get this errors: ``` 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 ``` Now if removed the brackets of `case` statment I get this 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. ``` The complete source code of `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) Am I using brackets incorrectly? 2) Why using brackets in `case` statement shows `crosses initialization` to other lines of code.