得到一堆十字架初始化错误

Posted

技术标签:

【中文标题】得到一堆十字架初始化错误【英文标题】:Getting a bunch of crosses initialization error 【发布时间】:2012-07-20 11:59:57 【问题描述】:

我有这个从下载的示例中提取的 sn-ps 代码:

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;

现在如果编译程序我得到这个错误:

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 语句的括号,我会收到此错误:

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) 我是不是用错了方括号?

2) 为什么在case 语句中使用方括号将crosses initialization 显示给其他代码行。

【问题讨论】:

您确定您发布了正确的代码吗?因为错误消息抱怨(除其他外)initialization of 'MessageEvent* me',并且发布的代码中的任何地方都没有me 变量? @JoachimPileborg 看起来MessageEvent* me 类位于另一个文件中。谢谢你注意到我。 Error: Jump to case label的可能重复 【参考方案1】:

C++ 标准说:

可以转移到一个块中,但不能以某种方式转移 通过初始化绕过声明。一个程序从一个 具有自动存储持续时间的局部变量不在的点 范围到它在范围内的点是格式错误的,除非 变量具有 POD 类型 (3.9) 并且在没有初始化程序的情况下声明。

switch 中的案例被视为“跳跃”。

只需将所有对象和变量初始化在您的切换之前,一切都会好起来的。

考虑这段代码:

switch(k)

    case 1:
        int t = 4;
    break;
    default:
    break;

这将导致“交叉初始化”错误,因为可以跳过 t 的初始化,但之后它仍然在范围内,即使它从未在第一次创建地点。

现在考虑一下:

switch(k)

    case 1:
    
        int t = 4;
    
    break;
    default:
    break;

在这里,你会没有出现错误,因为变量在一个块内,并且会在块的末尾(在结束处)死掉,所以之后它会在任何情况下都在范围内。

要解决第一种情况,您只需要这样做:

int t = 0;
switch(k)

    case 1:
        t = 4;
    break;
    default:
    break;

【讨论】:

【参考方案2】:

我正在将一些旧代码从 C 移植到 C++,其中包含很多 goto(到错误退出)。 这个问题也出现在 switch 语句之外。

我对 gcc/g++ 的简单解决方法(使用 arm-linux-androideabi-gcc v4.6 测试):

如果你有

goto err_exit;
int a = 1;

它抱怨。

将 -fpermissive 添加到您的命令行,然后替换:

goto err_exit;
int a;
a = 1;

没有投诉。

【讨论】:

以上是关于得到一堆十字架初始化错误的主要内容,如果未能解决你的问题,请参考以下文章

“配置系统初始化失败”的 App.Config 错误

为什么我在运行webrick服务器时会得到未初始化的常量设计名称错误?

g++(4.7.2)错误或功能,在编译时初始化静态数组时?

尝试快速初始化超类属性但遇到错误

iOS - SharedApplication 在 Today Extension 中不可用?

“NoClassDefFoundError:无法初始化类”错误