enum。它们位于相同的命名空间中,但头文件不同。//C1.h
#include <QObject>
namespace SW
{
Q_NAMESPACE
enum class Enum1 {A, B};
Q_ENUM_NS(Enum1)
}
Run Code Online (Sandbox Code Playgroud)
//C2.h
#include <QObject>
namespace SW
{
Q_NAMESPACE
enum class Enum2 {A, B};
Q_ENUM_NS(Enum2)
}
Run Code Online (Sandbox Code Playgroud)
//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();
}
Run Code Online (Sandbox Code Playgroud)
moc_C1.o都moc_C2.o定义了staticMetaObject结果Q_NAMESPACEQ_NAMESPACE. 否则 moc 会抱怨“错误:命名空间声明缺少 Q_NAMESPACE 宏。”me1 valid: true
me2 valid: true
Run Code Online (Sandbox Code Playgroud)
Q_NAMESPACE),它会编译但在运行时出现故障:me1 valid: true
me2 valid: false
Run Code Online (Sandbox Code Playgroud)
问题:是否没有办法使用Q_NAMESPACE分布在多个文件上的命名空间?
我能想到的解决这个问题的方法:
小智 2
官方 Qt 问题跟踪器QTBUG-68611中有相应的问题。然而,该问题因超出范围而被关闭,因为由于 Qt 元对象编译器 (moc) 的设计,对此无能为力。
简而言之,Qt 不能支持多个头文件,每个头文件都有Q_NAMESPACE宏。这不可能。
或者,您可以(尽管我不建议)在文件结构之间设置一个中间层,如下所示:
// internal/C1.h
#include <QObject>
enum class Enum1 {A, B};
Q_ENUM_NS(Enum1)
Run Code Online (Sandbox Code Playgroud)
//internal/C2.h
#include <QObject>
enum class Enum2 {A, B};
Q_ENUM_NS(Enum1)
Run Code Online (Sandbox Code Playgroud)
// C.h
#include <QObject>
namespace SW
{
Q_NAMESPACE
#include internal/C1.h
#include internal/C2.h
}
Run Code Online (Sandbox Code Playgroud)