#include <QDebug>
#include <QString>
int main()
{
char aaa[] = {"abcdefg"};
QString bbb(QString::fromLatin1(aaa));
qDebug()<<bbb;
qDebug()<<((QString)aaa); //dangerous way
qDebug()<<(reinterpret_cast<QString>(aaa)); //dangerous way
return a.exec();
}
只要我知道,这可能会导致一些未定义的行为,但代码可以正常工作 c风格的演员怎么可以工作?
编辑: 这是安全的操作吗?
答案 0 :(得分:2)
qt使用构造函数
定义从char*
到QString
的转换
这意味着c-style强制转换((QString)aaa)
已经很好地定义了(通过尝试构造函数的static_cast
机制)虽然在编码方面很危险。
您可以通过定义QT_NO_CAST_FROM_ASCII
答案 1 :(得分:0)
答案 2 :(得分:0)
“这是安全的操作吗?”
没有。 C ++中的C风格转换通常不被视为安全操作。原因?有许多不同类型的强制转换,并且使用C风格的强制转换意味着您告诉编译器它应该选择其中一个。问题是,这可能导致与您想要的结果不同。 “C ++编码标准:规则,指南和最佳实践”中的一章就是关于这一点。
示例想象一下:
class Based { ... }
class Derived : Based { ... }
现在源文件#1:
class Based;
class Derived;
Derived* boo();
Based* foo1()
{
Derived *a = boo();
Based *b = (Based*)a;
return b;
}
来源#2:
#include "Based.h" // Contains definition of Based class
#include "Derived.h" // Contains definition of Derived class
Derived* boo();
Based* foo2()
{
Derived *a = boo();
Based *b = (Based*)a;
return b;
}
两个来源都会编译!但是foo1()
使用了不同类型的强制转换foo2()
!第一种情况很糟糕,仅在特殊情况下有效(但即使这不是标准定义)。
换句话说,在foo1()
中,您告诉编译器“将Derived
的指针视为Based
的指针”,但在第二种情况下,您告诉编译器“将Derived
投射到其父级Based
“。
foo1()
可能会随机崩溃或导致您的代码非常奇怪。
顺便说一下。你的编译器可能永远不会警告你。所以,避免C风格的演员!