什么是c ++类访问关键字"信号"意思?

时间:2015-04-01 17:53:01

标签: c++ qt class keyword

我遇到了类似于此的声明(名称按NDA更改):

class Foo
{
    int  bar;

 public:
    explicit Foo (Fu *parent = NULL);

 private:
    void somefunc (String);

 signals:        // ??? what does this do ???
    void windowClosed();
};

这是由g ++ 4.4.7(从大约2012年)成功编译的。此外,vim通过以棕色突出显示将其识别为与publicprivate类似的关键字。 (Dis)类似地,vim使用绿色突出显示关键字namespaceclassvoidintdoublefloat,{{ 1}},char

Stackoverflow代码格式化程序高亮显示unsigned,就像它signalspublic一样!

事实证明谷歌很难(很多噪音),但我还没有找到任何提及它的东西,甚至在SO上也没有。我还查看了g ++文档的enhancements section

此代码库很大(超过2300万行),古老(〜1998),并且具有明显的重音。例如,相同的类定义在两个成员函数之前具有类访问private。因此,有可能会进行一些private slots:混淆或欺骗,但我无法使用#define找到它。 g ++可能已被更改,但其grep输出不表示修改。

3 个答案:

答案 0 :(得分:4)

它不是关键字,如果您使用的是Qt这样的框架,它会将“关键字”添加到该语言中,以提供不属于标准的其他功能。

在Qt中,例如,此代码由MOC(元对象编译器)预处理,signalsqobjectdefs.h中定义为#define signals public,moc检查此宏以添加元-code并提供实际的信号槽功能,生成的代码被放入一个名为'moc_myClass.cpp'的文件中。

答案 1 :(得分:2)

这些不是c ++关键字! c ++不会编译它们,除非你从Qt库中包含一个标题,它将使用预处理器删除它们:

//from qobjectdefs.h
#     define slots
#     define signals public

这些是"标签"由Qt Library Preprocessor(moc,Meta Object Compiler)用于处理它们。

它们标记在对象之间的信号槽通信机制中使用的方法。只有在使用Q_OBJECT宏标记类时,moc才会处理它们,并且这些类必须从QObject继承。

从这些中,moc在moc_xxxxx.h和moc_xxxxx.cpp源文件中创建一个伴随类,其中包含处理信号/插槽机制所需的代码。

即使您有Qt标头和库,如果没有qmake生成的源,您通常也无法链接代码。

答案 2 :(得分:0)

signals是由Qt框架定义的宏,在编译期间转换为public,同时作为 beacon 到Qt的moc预处理器以实现观察者类似于“信号”和“槽”的类关系。其他类似的Qt宏包括slotsQ_SLOTS