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

wal*_*lyk 5 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();
};
Run Code Online (Sandbox Code Playgroud)

这是由g ++ 4.4.7(从大约2012年)成功编译的.此外,vim将其识别为类似的关键字,publicprivate以棕色突出显示.(DIS)similiarly,Vim使用绿色突出关键字namespace,class,void,int,double,float,char,unsigned,等.

在#1代码格式化并没有突出signals像它上面publicprivate!

事实证明谷歌很难(很多噪音),但我没有发现任何提及它,甚至没有提到它.我还查看了g ++文档的增强功能部分.

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

Ale*_*íaz 5

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

例如,在Qt中,此代码由MOC(元对象编译器)处理,signals定义qobjectdefs.h#define signals public,moc检查该宏以添加元代码并提供实际的信号时隙功能,并将生成的代码放入名称为“ moc_myClass.cpp”的文件。

  • 其实这也不是很准确。`moc`不会在编译之前更改代码本身(这对于以许多翻译单元进行编译的标头如何工作?),它只是进行*附加*处理以生成元数据代码。由于Qt“关键字”是通过宏定义给其他对象的,因此代码可以在常规C ++编译器中按原样编译。 (2认同)