Как я могу проверить соединение сигнала / слота во время компиляции?

Проверка звонков в слоте 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}}
Другие вопросы по тегам