Qt Moc生成具有未定义行为的代码

时间:2014-02-10 21:05:27

标签: qt c++11 clang++

我有一个简单的类,它有一个QT信号,在编译moc生成的代码时给我带来麻烦。我不使用qmake构建系统,但我的scons构建脚本直接调用qt'moc命令。

相关的源文件“write_qstring.h”是:

#ifndef LOG_WRITE_QSTRING_POLICY_H
#define LOG_WRITE_QSTRING_POLICY_H

#include <QObject>
#include <QString>

namespace Log
{
class WriteQString : public QObject
    {
    Q_OBJECT
    public:
    signals:
    void Changed(QString newString);
    };

}

#endif // LOG_WRITE_QSTRING_POLICY_H

我使用以下命令运行moc编译器:

  

/opt/Qt/5.2.0/gcc_64/bin/moc -DQT_CORE_LIB   -I / opt / Qt / 5.2.0 / gcc_64 / include / QtCore -I / opt / Qt / 5.2.0 / gcc_64 / include -o moc_write_qstring.cc write_qstring.h

然后我使用clang ++编译生成的moc_write_qstring.cc:

  

clang ++ -o moc_write_qstring.o -c -Weverything -pedantic -g -std = c ++ 11   -fcxx-exceptions -pthread -fdiagnostics-fixit-info -fPIC -Wno-c ++ 98-compat -Wno-documentation-unknown-command -Wno-documentation -Wno-padded -Wno-weak-vtables -Wno-exit- time-destructors -Wno-global-constructors -isystem / opt / Qt / 5.2.0 / gcc_64 / include -isystem / opt / Qt / 5.2.0 / gcc_64 / include / QtCore -DQT_CORE_LIB -I / opt / Qt / 5.2。 0 / gcc_64 / include / QtCore moc_write_qstring.cc

这会发出有关未定义行为的警告:

  

警告:取消引用类型'_t '(又名'无效   (Log :: WriteQString :: *)(QString)')来自类型的reinterpret_cast   'void **'有未定义的行为[-Wundefined-reinterpret-cast]   相关的行是:   if(* reinterpret_cast&lt; _t *&gt;(func)==   static_cast&lt; _t&gt;(&amp; WriteQString :: Changed)){

由于编译器警告未定义的行为,我只能认为代码被破坏,但为什么metacompiler会发出破坏的代码? 我在这里做错了什么?这是一个c ++ 11问题吗?

clang ++的输出--version

  

Ubuntu clang版本3.5-1~exp1(trunk)(基于LLVM 3.5)目标:   x86_64-pc-linux-gnu线程模型:posix

输出qmake --version

  

QMake 3.0版在/opt/Qt/5.2.0/gcc_64/lib中使用Qt 5.2.0版

0 个答案:

没有答案