我从下载的示例中获取了这段代码:
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
。
答案 0 :(得分:97)
C ++标准说:
可以转移到块中,但不能转移到块中 通过初始化绕过声明。一个从a跳的程序 具有自动存储持续时间的局部变量不在的点 范围到它在范围内的地方是不正确的,除非 变量具有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;
}
答案 1 :(得分:6)
将一些旧代码从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;
没有抱怨。