命名空间重定义机制如何工作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命名空间重定义机制如何工作?相关的知识,希望对你有一定的参考价值。
我试图了解Qt的UIC机制。我的问题与C ++有关。
问题很清楚。我使用Qt Creator 4.4.1创建了我的演示。这些是我会询问的文件。
第一个:我的小部件的头文件
#ifndef SHAPECHANGING_H
#define SHAPECHANGING_H
#include <QDialog>
//HERE
namespace Ui {
class ShapeChanging;
}
class ShapeChanging : public QDialog
{
Q_OBJECT
public:
explicit ShapeChanging(QWidget *parent = 0);
~ShapeChanging();
private:
Ui::ShapeChanging *ui;
};
#endif // SHAPECHANGING_H
第二:uic生成的文件
#ifndef UI_SHAPECHANGING_H
#define UI_SHAPECHANGING_H
#include <QtCore/QVariant>
...
QT_BEGIN_NAMESPACE
class Ui_ShapeChanging
{
public:
QVBoxLayout *verticalLayout_2;
QVBoxLayout *verticalLayout;
...
};
//HERE
namespace Ui {
class ShapeChanging: public Ui_ShapeChanging {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_SHAPECHANGING_H
在两个文件的HERE注释中,您会看到相同的命名空间声明。在第一个声明中,ShapeChanging类是前向声明的。而在第二部分中,ShapeChanging类是从另一个类派生的。那么,它是否已在第二次ui声明中实施?如果,这是真的,任何人都可以解释这个C ++规则吗?
谢谢。
答案
QT_BEGIN_NAMESPACE
/ QT_END_NAMESPACE
是一个宏,如果Qt是使用自定义命名空间编译的话会扩展(如果你从Qt网站下载它就不会发生)。如果您正在编译Qt以使用与Qt名称冲突的库,则此选项很有用 - 您可以在此处阅读更多相关信息:http://wiki.qt.io/Qt_In_Namespace。
对于你的第二个问题,我认为他们只是想将UIC生成的所有类分组到单个命名空间中(同样的事情在这里讨论Qt Ui namespace)。我不确定两个类的基本原理是什么,也许有一些历史原因,或者以这种方式编写生成器模板更容易。
我唯一真正关心的事情是,由于Qt永远存在,它还针对没有适当命名空间支持的编译器,因此他们希望将Ui
命名空间作为可以轻易关闭的可选项。
以上是关于命名空间重定义机制如何工作?的主要内容,如果未能解决你的问题,请参考以下文章