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