QtAda: Как подавить предупреждения компилятора о неизвестных прагмах Q_Slot и Q_Signal

Автор: Vadim Godunko
Дата: 23.09.2010

При компиляции программ, использующих QtAda нередко встречаются диагностические сообщения компилятора о неизвестных прагмах Q_Slot и Q_Signal. Эти прагмы предназначены для компилятора метаинформации, а соответствующие предупреждения компилятора не являются актуальными; более того, они не позволяют использовать режим компилятора при котором любые предупреждения рассматриваются как ошибки.

Простейшим способом подавления этих предупреждений является отключение предупреждений перед прагмами Q_Slot и Q_Signal и включение предупреждений сразу же после прагм. Для этого возможно использовать прагму Warnings:


          

          
   procedure My_Slot (Self : not null access My_Widget'Class);
   pragma Warnings (Off);
   pragma Q_Slot (My_Slot);
   pragma Warnings (On);

   procedure My_Signal (Self : not null access My_Widget'Class);
   pragma Warnings (Off);
   pragma Q_Signal (My_Signal);
   pragma Warnings (On);

Серьёзным недостатком этого способа является нарушение читаемости кода за счёт наличия дополнительных прагм. При использовании компилятора GNAT GPL 2010 можно использовать особую форму прагмы Warnings, позволяющую отключить не все, а только конкретные предупреждения. В этом случае в контексте пакета можно написать:


          

          
pragma Warnings (Off, "unrecognized pragma ""Q_Slot""");
pragma Warnings (Off, "unrecognized pragma ""Q_Signal""");

package My_Widgets is

Этот способ подходит для приложений в которых не используется большое количество собственных классов объектов, в противном случае указанные прагмы необходимо включать в любой пакет где объявляется порождённый от Q_Object тип, что тоже не очень приятно. Поэтому пожалуй самым интересным является глобальное отключение этих предупреждений с использованием файла конфигурации. Для этого необходимо создать файл конфигурации, например qtada.adc, следующего содержания:


          

          
pragma Warnings (Off, "unrecognized pragma ""Q_Slot""");
pragma Warnings (Off, "unrecognized pragma ""Q_Signal""");

Теперь осталось проинструктировать компилятор о необходимости использования файла конфигурации. Это возможно сделать с помощью ключа -gnatec=qtada.adc (если вызов компилятора выполняется напрямую) или же просто добавив атрибут Global_Configuration_Pragmas пакета Builder в файл проекта:


          

          
   package Builder is
      for Global_Configuration_Pragmas use "qtada.adc";
   end Builder;