Вопрос

В Qt оба они действительны и ведут себя одинаково:

emit someSignal(value);

против

emit(someSignal(value));

Есть ли разница?

Это было полезно?

Решение

Есть ли разница?

Нет никакой разницы, кроме того, что внешняя скобка не нужна, поэтому программисты предпочтут ее, и она также более традиционно используется в проектах Qt.

Причина отсутствия разницы заключается в следующем:

# define emit

Вы можете увидеть определение этого в исходном коде.

Таким образом, по сути, он просто объявляется как «пустая» строка, и препроцессор заменит ваши варианты на:

someSignal(value);

или

(someSignal(value));

Вы могли бы убедиться в этом сами, если бы для быстрого теста остановили выполнение компилятора после запуска препроцессора, напримертот -E вариант в случае gcc.

Дальнейшая информация:кто-то в комментарии сомневался в ключевом слове "emit", поскольку оно загрязняет глобальное пространство имен макросов.Это правда, но это хороший способ гарантировать наличие какого-то общего способа сделать это, и это хорошо.

С другой стороны, это не является обязательным, поэтому любой может переопределить, отменить определение или даже отключить его. сообщив Qt не использовать ключевые слова следующим образом:

CONFIG += no_keywords

Таким образом, все еще можно будет использовать механизм сигнальных слотов Qt с Q_SIGNAL, Q_SIGNALS, Q_SLOT, Q_SLOTS, Q_EMIT и все такое.

Здесь вы можете найти соответствующая документация о Q_EMIT, например:

Q_EMIT

Используйте этот макрос, чтобы заменить ключевое слово излучения для генерации сигналов, если вы хотите использовать сигналы и слоты Qt со сторонним механизмом сигналов/слотов.

Макрос обычно используется, когда no_keywords указан с помощью переменной CONFIG в файле .pro, но его можно использовать, даже если no_keywords не указан.

Другие советы

Нет разницы.На самом деле генеракодицетагкод определяется как пустой макрос, так что только

someSignal(value);
.

также эквивалентно.Генеракодицетагкод просто делает его более очевидным, что вы запускаете сигнал QT.

Нет абсолютно никакой разницы.Это пустое определение препроцессора и, таким образом, удаляется до того, как компилятор увидит код.Что касается заинтересованного компилятора, это даже не существует.

Это существует исключительно в интересах программиста, чтобы позволить ему / ей знать, что в этот момент сигнал может быть обработан и может помочь в отладке кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top