Как правильно включить заголовки Qt? - PullRequest
6 голосов
/ 14 декабря 2010

До сих пор я знаю несколько способов #include классов Qt:

  • #include <QtModule>

    Сюда входят все классы определенного модуля, например QDomDocument, QDomElement, QDomNode и многие другие из #include <QtXml>.

  • #include <QClassName>

    Это добавляет объявление определенного класса, который вы можете захотеть использовать, например, QEvent, QStringList, QFile.

  • #include <qcstyleheader.h>

    Это влияет на предыдущий метод, за исключением различно выглядящего имени заголовка.

Итак, мне интересно, есть ли другие способы #include Qt-классов? Являются ли они эквивалентными или некоторые из них предпочтительнее других по каким-то причинам? Зависит ли это от #include -ing внутри .cpp или .h файла? Влияет ли это на скорость компиляции и размер исполняемого файла?

Короче, как лучше всего идти?

Ответы [ 4 ]

10 голосов
/ 14 декабря 2010

Как правило, чем больше заголовочных файлов, тем больше времени требуется компилятору для разбора каждого модуля.(Очевидно, что предварительно скомпилированные заголовки отображают некоторые из этих спорных моментов.) Поэтому вы, как правило, хотите включить наименьшее количество заголовочных файлов, необходимых для правильной сборки приложения.

Если вы используете только несколько классов в данном модуле компиляции, тогда простовключите классы по имени в современном стиле:

#include <QEvent>
#include <QPainter>
#include <QFont>

Если вы используете большое количество классов из данного модуля, возможно, так же просто включить заголовок уровня модуля, например:

#include <QtGui>

Как правило, старый стиль .h используется только в том случае, если более новый заголовок стиля не существует.

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

1 голос
/ 14 декабря 2010

Лично я обнаружил значительные преимущества (~ 30% от времени компиляции?) От включения всех включенных в Qt элементов, которые я использую, в предварительно скомпилированный заголовок ( пример ), а не в каждый .h / .cpp по мере необходимости. Конечно, минус в том, что вы можете упустить из виду, от каких битов Qt конкретно зависят ваши отдельные исходные файлы, но я сам не нашел в этом проблемы.

1 голос
/ 14 декабря 2010

Я не думаю, что есть универсальный правильный способ включения ... Мой предпочтительный способ - второй, так как он самый простой - вы просто делаете это для каждого класса, который вы используете в своем файле, нужно гораздо меньше думать.

Что касается скорости компиляции, то да, заголовки Qt иногда компилируются. Если вы хотите компилировать быстрее, #include все, что вам нужно в .cpp файлах. Иногда вам нужно включить в .h файлы - если вы объявляете класс, вам всегда нужно #include его базовый класс и классы любых членов, которые вы храните по значению внутри класса или передаете по значению в функции класса. Однако для тех членов и параметров функций, которые объявлены как указатели, умные указатели или ссылки, вы можете заменить #include на "class foo;" декларация. Тогда ваш заголовок будет компилироваться быстрее, но вы все равно должны #include эти классы всякий раз, когда вы фактически используете их по значению.

1 голос
/ 14 декабря 2010

Этот шов для общего вопроса. И ответ прост: включайте только то, что должны. В противном случае вы замедляете компиляцию. В шапке попробуй форвард объявить. Если этого недостаточно, включите заголовок, объявляющий класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...