Инструменты пользователя

Инструменты сайта


// Qt Creator: C/C++ parser and "pre-included" headers

Некоторые компиляторы (если не все) поддерживают такую функциональность: через параметр командной строки можно указать файл или файлы, которые будут подключаться автоматически к каждому обрабатываемому файлу. У GCC это опция -include <file>.

В некоторых проектах используют эту особенность, как результат - явного включения файла нет, а парсер в Qt Creator'е не видит части объявлений.

Решения единого нет: для каждого типа проекта (qmake, cmake, generic & etc), теоретически, оно своё (если есть вообще). В моём случае используется Generic project, для него решение существует.

И решение достаточно простое: Generic Project Mananger использует несколько файлов для хранения настроек проекта:

  • ProjectName.creator - головной файл, по сути не содержит никакой полезной информации
  • ProjectName.files - список файлов проекта (может содержать и не исходники)
  • ProjectName.includes - пути поиска заголовочных файлов
  • ProjectName.config - как гласит комментарий внутри этого файла: «ADD PREDEFINED MACROS HERE!»

Вот последний файл самый интересный. Комментарий немного наводит в ступор и мы решаем, что тут можно только писать код вида:

#define MACRO some_value

На самом деле, парсером этот файл воспринимается как обычный заголовочный файл и информация из него используется для парсинга всего остального. Чуете профит? Если нет, подсказываю: по сути это и есть наш «pre-included» header для парсера! И писать в нём мы можем всё, что понимается препроцессором (если быть точнее: парсером скеатора). Т.е. мы можем сделать такое:

#include "includes/pre-included.h"

И всё, что объявлено в нашем pre-included.h станет доступно парсеру при обработке каждого файла. Дело сделано!

Было бы любопытно узнать как такое можно реализовать для Qmake и Cmake проектов.

PS вопрос этот я поднял в списке рассылки Qt Creator'а, пока ждал ответ, в голову пришла идея с #include, в результате список только подтвердил моё изыскание :)

UPDATE: рано обрадовался, внезапно, решение отказалось работать. Имхо, причина в несовсем корректном использовании .config файла.

Комментарии