我遇到了类似于此的声明(名称按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通过以棕色突出显示将其识别为与public
和private
类似的关键字。 (Dis)类似地,vim使用绿色突出显示关键字namespace
,class
,void
,int
,double
,float
,{{ 1}},char
等
Stackoverflow代码格式化程序不高亮显示unsigned
,就像它signals
和public
一样!
事实证明谷歌很难(很多噪音),但我还没有找到任何提及它的东西,甚至在SO上也没有。我还查看了g ++文档的enhancements section。
此代码库很大(超过2300万行),古老(〜1998),并且具有明显的重音。例如,相同的类定义在两个成员函数之前具有类访问private
。因此,有可能会进行一些private slots:
混淆或欺骗,但我无法使用#define
找到它。 g ++可能已被更改,但其grep
输出不表示修改。
答案 0 :(得分:4)
它不是关键字,如果您使用的是Qt这样的框架,它会将“关键字”添加到该语言中,以提供不属于标准的其他功能。
在Qt中,例如,此代码由MOC(元对象编译器)预处理,signals
在qobjectdefs.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宏包括slots
和Q_SLOTS
。