Frage

In Qt sind beide gültig und verhalten sich gleich:

emit someSignal(value);

vs

emit(someSignal(value));

Gibt es einen Unterschied?

War es hilfreich?

Lösung

Gibt es einen Unterschied?

Es gibt keinen anderen Unterschied, als dass die externe Klammer unnötig ist, also werden Programmierer das bevorzugen, und es wird auch konventioneller in Qt-Projekten verwendet.

Der Grund für das Fehlen eines Unterschieds liegt darin:

# define emit

Sie können die Definition davon sehen im Quellcode.

Daher wird es im Grunde nur zu einer "leeren" Zeichenfolge deklariert und der Präprozessor ersetzt Ihre Varianten durch:

someSignal(value);

oder

(someSignal(value));

Sie könnten dies selbst sehen, wenn Sie für einen schnellen Test die Ausführung des Compilers stoppen, nachdem der Präprozessor ausgeführt wurde, z.der -E option im Falle von gcc.

Weitere Informationen:jemand im Kommentar hatte Zweifel am Schlüsselwort emit, da es den globalen Makro-Namespace verschmutzt.Das stimmt, aber es ist ein guter Weg, um sicherzustellen, dass es einen gemeinsamen Weg gibt, dies zu tun, was eine gute Sache ist.

Andererseits ist dies nicht obligatorisch, sodass jeder es neu definieren, aufheben oder sogar ausschalten kann indem ich Qt erzähle verwenden Sie keine Schlüsselwörter wie folgt:

CONFIG += no_keywords

Auf diese Weise könnte es weiterhin möglich sein, den Qt-Signalschlitzmechanismus mit zu verwenden Q_SIGNAL, Q_SIGNALS, Q_SLOT, Q_SLOTS, Q_EMIT und das alles.

Hier finden Sie die entsprechende Dokumentation über Q_EMIT, beispielsweise:

Q_EMIT

Verwenden Sie dieses Makro, um das Schlüsselwort emit zum Senden von Signalen zu ersetzen, wenn Sie Qt-Signale und Slots mit einem 3rd-Party-Signal / Slot-Mechanismus verwenden möchten.

Das Makro wird normalerweise verwendet, wenn no_keywords mit der Konfigurationsvariablen in der .pro-Datei angegeben ist, aber es kann auch verwendet werden, wenn no_keywords nicht angegeben ist.

Andere Tipps

Es gibt keinen Unterschied.Tatsächlich, emit ist als leeres Makro definiert, also einfach

someSignal(value);

ist auch gleichwertig.Der emit macht es nur offensichtlicher, dass Sie ein Qt-Signal auslösen.

Es gibt absolut keinen Unterschied.Es ist eine leere Präprozessordefinition und wird daher entfernt, bevor der Compiler den Code erscheint.Soweit der betroffenen Compiler ist, gibt es nicht einmal.

Es existiert nur für den Vorteil des Programmierers, um ihn kennenzulernen, dass dies zu diesem Zeitpunkt ein Signal verarbeitet werden könnte und beim Debuggen des Codes helfen könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top