C++ 得到一堆十字架初始化错误
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11578936/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Getting a bunch of crosses initialization error
提问by SIFE
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
Now if removed the brackets of case
statment I get this error:
现在,如果删除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.
The complete source code of SimpleChatRoomServer.cpp
:
的完整源代码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) Am I using brackets incorrectly?
1)我是否错误地使用了括号?
2) Why using brackets in case
statement shows crosses initialization
to other lines of code.
2) 为什么在case
语句中使用方括号显示crosses initialization
给其他代码行。
回答by SingerOfTheFall
The C++ standard says:
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.
可以转移到块中,但不能通过初始化绕过声明。从具有自动存储持续时间的局部变量不在范围内的点跳转到它在范围内的点的程序是格式错误的,除非该变量具有 POD 类型 (3.9) 并且在没有初始化程序的情况下声明。
The cases in switch
are considered as a "jump".
中的案例switch
被视为“跳跃”。
Just put all objects and variables initializations before your switch, and everything will be fine.
只需将所有对象和变量初始化放在切换之前,一切都会好起来的。
Consider this code:
考虑这个代码:
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 的初始化,但之后它仍然在 scope 中,即使它从未被首先创建。
Now consider this:
现在考虑这个:
switch(k)
{
case 1:
{
int t = 4;
}
break;
default:
break;
}
Here, you will nothave 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 notbe 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;
}
回答by st68
Am porting some old code from C to C++, with lots of goto's (to error exits). This issue also arises outside of switch statements.
我正在将一些旧代码从 C 移植到 C++,有很多 goto(错误退出)。这个问题也出现在 switch 语句之外。
My simple work-around for gcc/g++ (tested with arm-linux-androideabi-gcc v4.6):
我对 gcc/g++ 的简单解决方法(用 arm-linux-androideabi-gcc v4.6 测试):
If you have
如果你有
goto err_exit;
int a = 1;
it complains.
它抱怨。
Add -fpermissive to your command line, and substitute:
将 -fpermissive 添加到您的命令行,并替换为:
goto err_exit;
int a;
a = 1;
no complaints.
没什么好抱怨的。