c++ class 访问关键字 "signals" 是什么意思?
What does the c++ class access keyword "signals" mean?
我遇到了一个类似于此的声明(根据 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
, char
, unsigned
, 等等
Whosebug 代码格式化程序 不 突出显示上面的 signals
就像 public
和 private
!
事实证明,Google 对此相当困难(很多噪音),但我没有找到任何提及它的内容,甚至在 SO 上也没有。我还查看了 g++ 文档的 enhancements section。
这个代码库很大(超过 23 万行),比较陈旧(~1998),并且有明显的口音。例如,相同的 class 定义在两个成员函数之前具有 class 访问权限 private slots:
。所以可能存在一些 #define
混淆或欺骗,但我无法使用 grep
找到它。可能 g++ 已被更改,但它的 --version
输出不表示修改。
这些不是c++关键字! c++ 不会编译它们,除非你从 Qt 库中包含一个头文件,它将使用预处理器删除它们:
//from qobjectdefs.h
# define slots
# define signals public
这些 "tags" 被 Qt 库预处理器(moc,元对象编译器)用于处理它们。
它们标记在对象之间的信号槽通信机制中使用的方法。只有当class被Q_OBJECT宏标记时,moc才会处理它们,并且这些classes必须继承自QObject。
根据这些,moc 在 moc_xxxxx.h 和 moc_xxxxx.cpp 源文件中创建了一个伴侣 class,其中包含处理 signal/slot 机制的必要代码。
即使您有 Qt 头文件和库,如果没有 qmake 生成的源代码,您通常也无法link代码。
它不是关键字,如果您使用的是诸如 Qt 之类的框架,它会添加到语言中 'keywords' 以提供不属于标准的附加功能。
例如在 Qt 中,此代码由 MOC(元对象编译器)预处理,signals
在 qobjectdefs.h
中定义为 #define signals public
,moc 检查此宏以添加元代码并提供实际的信号槽功能,生成的代码被放入一个名称为 'moc_myClass.cpp'.
的文件中
signals
是由 Qt 框架定义的宏,在编译期间被翻译成 public
,同时作为 Qt 的 moc
的 beacon ] 用于实现与 "signals" 和 "slots" 类似观察者的 class 关系的预处理器。其他类似的 Qt 宏包括 slots
和 Q_SLOTS
.
我遇到了一个类似于此的声明(根据 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
, char
, unsigned
, 等等
Whosebug 代码格式化程序 不 突出显示上面的 signals
就像 public
和 private
!
事实证明,Google 对此相当困难(很多噪音),但我没有找到任何提及它的内容,甚至在 SO 上也没有。我还查看了 g++ 文档的 enhancements section。
这个代码库很大(超过 23 万行),比较陈旧(~1998),并且有明显的口音。例如,相同的 class 定义在两个成员函数之前具有 class 访问权限 private slots:
。所以可能存在一些 #define
混淆或欺骗,但我无法使用 grep
找到它。可能 g++ 已被更改,但它的 --version
输出不表示修改。
这些不是c++关键字! c++ 不会编译它们,除非你从 Qt 库中包含一个头文件,它将使用预处理器删除它们:
//from qobjectdefs.h
# define slots
# define signals public
这些 "tags" 被 Qt 库预处理器(moc,元对象编译器)用于处理它们。
它们标记在对象之间的信号槽通信机制中使用的方法。只有当class被Q_OBJECT宏标记时,moc才会处理它们,并且这些classes必须继承自QObject。
根据这些,moc 在 moc_xxxxx.h 和 moc_xxxxx.cpp 源文件中创建了一个伴侣 class,其中包含处理 signal/slot 机制的必要代码。
即使您有 Qt 头文件和库,如果没有 qmake 生成的源代码,您通常也无法link代码。
它不是关键字,如果您使用的是诸如 Qt 之类的框架,它会添加到语言中 'keywords' 以提供不属于标准的附加功能。
例如在 Qt 中,此代码由 MOC(元对象编译器)预处理,signals
在 qobjectdefs.h
中定义为 #define signals public
,moc 检查此宏以添加元代码并提供实际的信号槽功能,生成的代码被放入一个名称为 'moc_myClass.cpp'.
signals
是由 Qt 框架定义的宏,在编译期间被翻译成 public
,同时作为 Qt 的 moc
的 beacon ] 用于实现与 "signals" 和 "slots" 类似观察者的 class 关系的预处理器。其他类似的 Qt 宏包括 slots
和 Q_SLOTS
.