通过c样式转换将char *转换为QString

时间:2014-05-28 09:30:27

标签: c++ qt

#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风格的演员怎么可以工作?

  • os:win7 64
  • 编译器:mingw4.8.2
  • Qt:5.2

编辑: 这是安全的操作吗?

3 个答案:

答案 0 :(得分:2)

qt使用构造函数

定义从char*QString的转换

这意味着c-style强制转换((QString)aaa)已经很好地定义了(通过尝试构造函数的static_cast机制)虽然在编码方面很危险。

您可以通过定义QT_NO_CAST_FROM_ASCII

来停用此功能

答案 1 :(得分:0)

你的问题是:是否有一种将char *转换为QString的方法?因为这个问题已经有了答案......

Qt char* to QString

亲切的问候

答案 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风格的演员!