enum
秒。它们在相同的名称空间中,但是头文件不同。//C1.h
#include <QObject>
namespace SW
{
Q_NAMESPACE
enum class Enum1 {A, B};
Q_ENUM_NS(Enum1)
}
//C2.h
#include <QObject>
namespace SW
{
Q_NAMESPACE
enum class Enum2 {A, B};
Q_ENUM_NS(Enum2)
}
//main.c
#include <QDebug>
#include <QMetaEnum>
#include "C1.h"
#include "C2.h"
int main(int argc, char *argv[]) {
auto me1 = QMetaEnum::fromType<SW::Enum1>();
qDebug() << "me1 valid:" << me1.isValid();
auto me2 = QMetaEnum::fromType<SW::Enum2>();
qDebug() << "me2 valid:" << me2.isValid();
}
moc_C1.o
和moc_C2.o
限定的staticMetaObject
从该结果Q_NAMESPACE
Q_NAMESPACE
。否则,moc会抱怨“错误:命名空间声明缺少Q_NAMESPACE宏。”me1 valid: true
me2 valid: true
Q_NAMESPACE
),它将编译但在运行时出现故障:me1 valid: true
me2 valid: false
问题:没有办法Q_NAMESPACE
用于分散在多个文件中的名称空间吗?
方法这项工作围绕这个问题,我能想到的:
根据他们的问题跟踪器QTBUG-68611,这似乎是一个已知的错误。
在解决此限制之前,我们将不得不忍受这一限制。
或者,您可以(尽管我不建议)在中间插入这样的文件结构:
// internal/C1.h
#include <QObject>
enum class Enum1 {A, B};
Q_ENUM_NS(Enum1)
//internal/C2.h
#include <QObject>
enum class Enum2 {A, B};
Q_ENUM_NS(Enum1)
// C.h
#include <QObject>
namespace SW
{
Q_NAMESPACE
#include internal/C1.h
#include internal/C2.h
}