Как я могу проверить соединение сигнала / слота во время компиляции?
Проверка звонков в слоте Qt connect во время выполнения - это проблема для меня. Я должен иметь возможность запустить статическую проверку операторов подключения.
Существует ли такой инструмент?
6 ответов
Используя QT5, вы можете использовать следующий синтаксис, который статически проверяется во время компиляции:
connect(sender, &Sender::signalMethod, receiver, &Receiver::slotMethod);
Существует ли такой инструмент?
Было бы неплохо, если бы такой инструмент существовал, но, к сожалению, он не существует из-за способа реализации механизма сигнал / слот в qt. Кроме того, по этой причине невозможно статически проверить, подходит ли сигнал в слот.
Если бы Qt использовал что-то вроде сигнала / слотов boost, это было бы возможно.
Я использовал что-то вроде этого в моем коде:
#define CONNECT_OR_DIE(source, signal, receiver, slot,connection_type) \
if(!connect(source, signal, receiver, slot,connection_type)) \
qt_assert_x(Q_FUNC_INFO, "CONNECT failed!!", __FILE__, __LINE__);
Я использовал его вместо простого вызова connect(). Это тебе поможет??
Вы можете рассмотреть возможность создания плагина GCC на C или расширения MELT, MELT - это предметно-ориентированный язык для простого кодирования расширений GCC. С помощью плагинов или расширений MELT вы можете проанализировать внутренние представления (особенно Tree-s, представляющие объявления классов и функций C++) и создать для этого специальный инструмент.
Тем не менее, расширение GCC требует понимания его довольно сложного внутреннего представления и потребует более недели усилий для человека, не знающего внутреннюю часть GCC.
Возможно, такие усилия не стоят того, если ваше приложение Qt не очень большое. Если вы решите поработать с MELT, я был бы рад вам помочь.
Вы не можете проверить это во время компиляции, но если вы запустите программу в режиме отладки внутри Qt Creator, она выведет полезное диагностическое сообщение на панели Application Ouptut, если connect
вызов не проходит. Смотрите мой ответ здесь.
Для работы с большой кодовой базой Qt4 я написал такой инструмент проверки, как плагин для статического анализатора clang.
Смотрите: http://reviews.llvm.org/D14592
Пример этого теста покрытия:
connect(&send, SIGNAL(f2(int, double*)), &recv, SLOT(bugaga(int, double*))); // expected-warning{{Can not find such slot}}