Стоит ли заново включать вещи, которые уже есть в предварительно скомпилированном заголовке области проекта? - PullRequest
1 голос
/ 11 сентября 2010

Не уверен, если это дубликат, пожалуйста, ссылайтесь на похожий вопрос, если он есть.

У меня есть предварительно скомпилированный заголовок stdafx.h, который используется во всех исходных файлах в моем проекте.Таким образом, все заголовки в stdafx.h доступны во всех файлах кода в проекте.

В чем я не уверен, так это в том, стоит ли повторно включать материал, который уже есть в скомпилированном заголовке.Как вы думаете, ребята?

например

stdafx.h

#pragma once

#include <memory>

my_class.h

#pragma once

#include <memory> // Re-include or not that's the question. Best practice?

struct my_class
{
};
typedef std::shared_ptr<my_class> my_class_ptr;

main.cpp

#include "stdafx.h"
#include "my_class.h"

int main()
{
}

РЕДАКТИРОВАТЬ: один раз добавил прагму

Ответы [ 3 ]

3 голосов
/ 11 сентября 2010

Я бы включил его, чтобы заголовок можно было повторно использовать в проекте, который имеет другой stdafx.h Другой способ указать это - каждый заголовок должен содержать все объявления (предпочтительно прямые), которые ему нужны сами по себе

Не будет никакого снижения производительности, так как содержимое заголовка не будет обработано из-за внутренней защиты заголовка (или для VS #pragma: один раз в файле заголовка.

1 голос
/ 11 сентября 2010

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

1 голос
/ 11 сентября 2010

В заголовке вы должны включить все, что необходимо для того, чтобы этот заголовок использовался отдельно.Если вы используете std::shared_ptr в заголовке, а этот шаблон взят из заголовка memory, включите заголовок memory.

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

Кстати, используйте эти механизмы (например, #pragma или #ifndef / #define) в заголовке.

...