命名空间重定义机制如何工作?

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命名空间作为可以轻易关闭的可选项。

以上是关于命名空间重定义机制如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

在 MonoTouch 中重命名命名空间

命名空间的定义

C++ 项目相关知识命名空间

重命名元素的 XSLT 问题——更改命名空间

如何永久重命名 C# 项目的 Properties 命名空间

xml 中的 Android 谷歌地图片段。我得到“意外的命名空间前缀”