Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

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("
"))
            {
                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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
149 views
Welcome To Ask or Share your Answers For Others

1 Answer

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share

548k questions

547k answers

4 comments

86.3k users

...