Differenza tra Emit ed Emit ()
-
21-12-2019 - |
Domanda
In Qt, entrambi sono validi e comportano lo stesso:
emit someSignal(value);
.
vs
emit(someSignal(value));
.
C'è qualche differenza?
Soluzione
.C'è qualche differenza?
Non c'è differenza diversa dalla staffa esterna inutile, quindi i programmatori lo preferiranno, ed è anche usato più convenzionalmente nei progetti QT là fuori.
Il motivo della nostra differenza è dovuto a questo:
# define emit
.
Puoi vedere la definizione di questo Nel codice sorgente .
Pertanto, è sostanzialmente dichiarato solo una stringa "vuota" e il preprocessore sostituirà le varianti su:
someSignal(value);
.
o
(someSignal(value));
.
Puoi vederlo se stessi se, per un test rapido, interrompi l'esecuzione del compilatore dopo che il preprocessore è eseguito, ad es. L'opzione -E
in caso di GCC.
Ulteriori informazioni: qualcuno nel commento aveva dubbi sulla parola chiave Emit perché inquinano lo spazio dei nomi macro globali. Questo è vero, ma è un buon modo per assicurarti che ci sia un modo comune di fare questo che è una buona cosa.
D'altra parte, questo non è obbligatorio, quindi chiunque potesse ridefinire, non perfinisce o addirittura lo spegnere raccontando qt non usare parole chiave come segue:
CONFIG += no_keywords
.
In questo modo, potrebbe essere ancora possibile utilizzare il meccanismo di slot del segnale QT con Q_SIGNAL
, Q_SIGNALS
, Q_SLOT
, Q_SLOTS
, Q_EMIT
e tutto questo.
Qui puoi trovare il documentazione corrispondente su Q_EMIT
, Ad esempio:
.q_emit
Utilizzare questa macro per sostituire la parola chiave EMIT per emettere segnali, quando si desidera utilizzare segnali e slot QT con un meccanismo di segnale / slot di 3a partito.
La macro viene normalmente utilizzata quando No_Keywords è specificato con la variabile di configurazione nel file .pro, ma può essere utilizzato anche quando no_Keywords non è specificato.
Altri suggerimenti
Non c'è differenza.Infatti, emit
è definito come una macro vuota, quindi solo
someSignal(value);
.
è anche equivalente.Il emit
rende solo più ovvio che stai attivando un segnale QT.
Non c'è assolutamente alcuna differenza.È una definizione vuota del preprocessore e quindi viene rimossa prima che il compilatore arrivi per vedere il codice.Per quanto riguarda il compilatore, non esiste nemmeno.
Esiste puramente a beneficio del programmatore, per fargli sapere che a quel punto, un segnale potrebbe essere elaborato e potrebbe aiutare nel debug del codice.