C++ 标准是否隐含或显式允许像 MOC 那样的语言扩展(或使用您喜欢的任何其他术语)?
也就是说,我们可以在技术上将 Qt(包括 MOC)称为符合 C++ 的实现吗?
C++ 标准是否隐含或显式允许像 MOC 那样的语言扩展(或使用您喜欢的任何其他术语)?
也就是说,我们可以在技术上将 Qt(包括 MOC)称为符合 C++ 的实现吗?
该标准并没有告诉您在编译文件之前不应该对文件进行预处理,这就是这样moc
做的,所以这是完全合法的。Qt 是 C++ 的库,而不是该语言的实现。
MOC 是代码生成器,而不是语言扩展。moc 生成的所有代码您也可以手动编写(虽然这会很耗时、令人麻木且容易出错)。Qt 使用一些宏,例如 Q_OBJECT、Q_SIGNALS、Q_SLOTS 等来进行声明并为 moc 提供提示。这是预处理器的完全“合法”使用。您可能认为非标准的唯一事情是在构建项目时运行 moc 以生成额外代码的额外步骤。不过,这是构建系统的问题(代码生成并不少见,参见解析器、IPC 接口等)并且超出了 C++ 的范围。
MOC 在技术上是一个预处理器,因此与 C++ 合规性问题无关。
MOC的输入不符合 C++ - MOC 接受关键字,例如slots
and signals
。但是 MOC 的输出符合 C++。
编辑以回复 Frank Osterfeld 的评论(我无法在评论中回复,我需要格式):
slots
并且signals
是 MOC 预处理器的关键字。如果定义了 Q_MOC_RUN(即 MOC 运行时),则 qobjectdefs.h 具有:
#define slots slots
#define signals signals
这使它们未被取代。