得到一堆crosses初始化错误 [英] Getting a bunch of crosses initialization error

查看:193
本文介绍了得到一堆crosses初始化错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个下载的示例代码片段:

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

现在如果删除 case statment的括号,我得到这个错误:

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.

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)我使用括号不正确吗?

1) Am I using brackets incorrectly?

2)为什么在 case 语句中使用括号表示跨初始化到其他代码行。

2) Why using brackets in case statement shows crosses initialization to other lines of code.

推荐答案

C ++标准说:


可以传递到一个块中,但不是以
通过初始化绕过声明的方式。一个从
跳转的程序,其中具有自动存储持续时间的局部变量不在
范围内,直到它在范围内的点成立,除非
变量具有POD类型

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 中的情况是被视为一个跳跃。

The cases in switch are considered as a "jump".

只要把所有的对象和变量初始化在你的切换之前,一切都会很好。

Just put all objects and variables initializations before your switch, and everything will be fine.

请考虑此代码:

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.

现在考虑一下,在初始化t之后,它仍然会在范围这:

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

这篇关于得到一堆crosses初始化错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆