2012-07-20 33 views
35

我有從下載的示例獲取的代碼,這個代碼片段:入門十字架初始化錯誤的一堆

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到其他代碼行。

+2

你確定你已經發布了正確的代碼嗎?由於錯誤消息會抱怨(其中包括)'MessageEvent * me''的初始化,並且發佈代碼中的任何地方都沒有'me'變量? – 2012-07-20 12:31:09

+1

@JoachimPileborg看起來像'MessageEvent * me'類位於另一個文件中。謝謝你注意到我。 – SIFE 2012-07-20 12:55:24

+0

可能重複的[錯誤:跳轉到案例標籤](http://stackoverflow.com/questions/5685471/error-jump-to-case-label) – 2016-03-02 20:24:33

回答

80

的C++標準說:

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的情況下,被認爲是一個 「跳」。

只需在切換之前放置所有對象和變量初始化,一切都會好的。

考慮以下代碼:

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

上午在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; 

沒有怨言。

+0

是啊g ++ goto邏輯被竊聽 – Lazik 2015-06-18 07:53:46