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

What does the c++ class access keyword "signals" mean?

本文关键字:是什么 意思 signals c++ 访问 关键字      更新时间:2023-10-16

我遇到了一个类似的声明(每个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,将其识别为类似于它们的关键字。类似地,vim使用绿色来突出显示关键字namespaceclassvoidintdoublefloatcharunsigned等。

Stackoverflow代码格式化程序不会像突出显示publicprivate那样突出显示上面的signals

事实证明,谷歌很难做到这一点(噪音很大),但我没有发现任何提及它的东西,甚至在SO上也没有。我还查看了g++文档的增强部分。

这个代码库很大(2300多万行),老掉牙(~1998),有着明显的重音。例如,相同的类定义在两个成员函数之前具有类访问private slots:。因此,可能存在一些#define混淆或欺骗行为,但我在使用grep时找不到。g++可能已更改,但其--version输出并不表示已更改。

它不是关键字,如果您使用Qt等框架,它会将"关键字"添加到语言中,以提供不属于标准的附加功能。

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

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

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

这些是Qt库预处理器(moc,元对象编译器)用于处理它们的"标记"。

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

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

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

signals是一个由Qt框架定义的宏,在编译过程中被转换为public,同时作为Qt的moc预处理器的信标,用于实现与"信号"answers"槽"的类关系。其他类似的Qt宏包括slotsQ_SLOTS