Получение пучки ошибок инициализации крестов
У меня есть эти фрагменты кода, взятые из загруженного примера:
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
statment, я получаю эту ошибку:
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
для других строк кода.
Ответы
Ответ 1
В стандарте С++ говорится:
Можно передать в блок, но не таким образом, чтобы обходит объявления с инициализацией. Программа, которая перескакивает с где локальная переменная с автоматическим временем хранения не находится в сфера до точки, в которой она находится в сфере охвата, переменная имеет тип 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 на С++, с большим количеством goto (до выхода ошибок).
Эта проблема также возникает вне операторов switch.
Моя простая работа для gcc/g++ (протестирована с помощью arm-linux-androideabi-gcc v4.6):
Если у вас
goto err_exit;
int a = 1;
он жалуется.
Добавьте -fpermissive в свою командную строку и замените:
goto err_exit;
int a;
a = 1;
нет жалоб.