发出和发出()的区别

8
在Qt中,两者都是有效的,并且表现相同:
emit someSignal(value);

vs

emit(someSignal(value));

有什么区别吗?
3个回答

11

有什么区别吗?

除了外部括号是不必要的之外,没有任何区别,所以程序员会更喜欢这种写法,而且在Qt项目中也更常用。

没有区别的原因是:

# define emit

您可以在源代码中看到此定义。

因此,它基本上只被声明为空字符串,预处理器会将您的变量替换为:

someSignal(value);
或者
(someSignal(value));

如果您进行快速测试,在预处理器运行后停止编译器的执行,例如gcc的-E选项,您就可以自己看到这一点。

更多信息:评论中有人对"emit"关键字表示怀疑,因为它会污染全局宏命名空间。这是正确的,但确保存在某种通用的方法来实现这一点是件好事,这一点不容置疑。

另一方面,这并非强制性的,因此任何人都可以重新定义、未定义甚至关闭它,如下所述:通过告诉Qt不使用关键字

CONFIG += no_keywords

这种方式仍然可以使用Qt信号槽机制及其所有功能,如Q_SIGNALQ_SIGNALSQ_SLOTQ_SLOTSQ_EMIT等。

您可以在相关文档中找到关于Q_EMIT的信息,例如:

Q_EMIT

使用此宏替换emit关键字以发出信号,当您想要将Qt信号与第三方信号/槽机制一起使用时。

通常在.pro文件中使用CONFIG变量指定no_keywords时会使用该宏,但即使未指定no_keywords也可以使用它。


好的,我现在明白了,实际上 moc 也会忽略 emit(尽管文档隐藏了这个事实)。我的新理论(为了不完全失去对 QT 开发人员的信心)是,早期实现的信号槽机制确实需要这个关键字,并且由于向后兼容性而保留了它(可能他们没有记录这个事实,以防将来的版本再次需要它)。无论如何,所有他们的文档都使用带有括号的 emit,这表明在您的代码中省略它们是一个好主意(即更具未来性)。 - celtschk
@celtschk moc 不需要使用 emit 关键字,因为 moc 会生成信号方法的实现。毕竟,信号只是一个迭代连接的槽并激活(调用)它们的方法。据我所知,在发布的 Qt 版本中从来没有使用过 emit 关键字。该关键字仅用于记录代码,完全是为了人类阅读方便而存在的。我很高兴它存在。我不知道文档隐藏了什么内容,但是没有任何文档也很容易理解信号的工作原理。这是基本的 C++。 - Kuba hasn't forgotten Monica

6
没有区别。事实上,emit被定义为一个空的宏,所以只需这样:
someSignal(value);

这也是等效的。只是emit使得你触发一个Qt信号更加明显。


1

这两者完全没有区别。它是一个空的预处理器定义,因此在编译器看到代码之前就被删除了。就编译器而言,它甚至不存在。

它纯粹是为了程序员的利益而存在,让他/她知道在那个点上,可能会处理信号,并有助于调试代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接