Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Правильное управление подключениями include

05.07.2017, 21:26. Показов 2190. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, Господа. Суть вопроса заключается в следующем
Есть статическая библиотека BTSEngine, у нее есть хедер, который содержит инклуды классов этой либы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#pragma once
 
//--------------------------------------------------------------------------------------------------
// Версия
//--------------------------------------------------------------------------------------------------
#define FRAMEWORK_VERSION 1.0
 
//--------------------------------------------------------------------------------------------------
// Инклуды
//--------------------------------------------------------------------------------------------------
#include "BTSPhysics.h"
#include "BTSGraphics.h"
#include "BTSAssets.h"
#include "BTSWindow.h"
#include "BTSInput.h"
#include "BTSMath.h"
#include "BTSAudio.h"
#include "BTSCore.h"
 
#include "Graphics/BTSBufferManager.h"
#include "Graphics/Buffers/BTSVertexBuffer.h"
#include "Graphics/Buffers/BTSIndexBuffer.h"
#include "Graphics/Buffers/BTSConstantBuffer.h"
#include "Graphics/Buffers/BTSBuffer.h"
 
#include "Graphics/BTSStateManager.h"
#include "Graphics/States/BTSBlendState.h"
#include "Graphics/States/BTSRasterizerState.h"
#include "Graphics/States/BTSDepthStencilState.h"
#include "Graphics/States/BTSSampleState.h"
 
// Глобальные
#include "Global/BTSSystem.h"
#include "Global/BTSComponent.h"
#include "Global/BTSSystemManager.h"
#include "Global/BTSObject.h"
#include "Global/BTSScene.h"
#include "Global/BTSEventManager.h"
#include "Global/BTSTechnique.h"
#include "Global/BTSTechniqueManager.h"
 
...
Также есть еще одна либа BTSAdditional, которая является дополнением к первой, она включает тоже заголовочный файл своих инклудов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#pragma once
 
// Системы
#include "Systems/BTSCameraSystem.h"
#include "Systems/BTSLightSystem.h"
#include "Systems/BTSMeshRenderSystem.h"
#include "Systems/BTSPhysicsRigidBodySystem.h"
#include "Systems/BTSPhysicsColliderSystem.h"
#include "Systems/BTSSpriteRenderSystem.h"
#include "Systems/BTSAudioSourceSystem.h"
#include "Systems/BTSAudioListenerSystem.h"
#include "Systems/BTSParticleSystem.h"
#include "Systems/BTSSkyboxSystem.h"
#include "Systems/BTSAnimationSystem.h"
#include "Systems/Shadow Mapping/BTSMeshRendererSystem.h"
#include "Systems/BTSTextSystem.h"
#include "Systems/BTSTimerSystem.h"
#include "Systems/BTSUISystem.h"
 
// Компоненты
#include "Components/Mesh/BTSComponentMeshFilter.h"
#include "Components/Mesh/BTSComponentMeshRenderer.h"
#include "Components/Mesh/BTSComponentMaterial.h"
#include "Components/Rendering/BTSComponentCamera.h"
#include "Components/Rendering/BTSComponentLight.h"
#include "Components/Rendering/BTSComponentTextRenderer.h"
#include "Components/Rendering/BTSComponentSpriteRenderer.h"
#include "Components/Rendering/BTSComponentSkybox.h"
...
В своем проекте, когда использую BTSEngine и BTSAdditional я пишу вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
 
//--------------------------------------------------------------------------------------------------
// Инклуды
//--------------------------------------------------------------------------------------------------
#include "BTSEngine.h"
#include "BTSAdditional.h"
 
//--------------------------------------------------------------------------------------------------
// Пространства имен
//--------------------------------------------------------------------------------------------------
using namespace BTSEngine;
using namespace BTSAdditional;
 
class Someclass
{
public:
...
};
Теперь вопрос, правильно ли организованы подключения хедеров? Может по отдельности нужно подключать каждый хедер из BTSEngine и BTSAdditional?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.07.2017, 21:26
Ответы с готовыми решениями:

Работа с файлами в C# с исп. библиотек #include <stdio.h> #include <stdlib.h> #include <math.h> #include <io.h>
В типизированном файле записаны названия городов и их численность. Увеличить численность каждого города на 5% (Количество жителей всегда...

#include<iostream>// подключение библиотек #include <conio.h> #include <climits>
помогите для этой программы сделать блок-схему. Пожалуйста #include&lt;iostream&gt;// подключение библиотек #include &lt;conio.h&gt; ...

Вопрос "хорошего тона", "стиля" в программировании - правильное использование #include
Привет. Вступление. Имею небольшой опыт в программировании. Сейчас мне дали разобрать один проект, как пример работы HGE и Box2D. ...

24
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.07.2017, 13:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
просто оставлю здесь:
Видимо, ты не понял смысл настроечного макроса

Цитата Сообщение от Croessmah Посмотреть сообщение
обычная проблема при копипасте - недокопировал
А тут по ходу и суть не понял. Возможно, я коряво объяснил
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
08.07.2017, 13:57
Цитата Сообщение от Evg Посмотреть сообщение
Возможно, я коряво объяснил
Нормально, вроде.
Цитата Сообщение от Evg Посмотреть сообщение
А тут по ходу и суть не понял.
Все всё поняли. Пример тоже годный, но я к тому,
что виноваты в этом не инклуды, а автор кода.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.07.2017, 14:17
А я и не говорю, что кто-то виноват. Я показал один из случаев, когда можно нарваться в ситуации, когда пытаешься минимизировать подключение хидеров. Причём нарваться так, что проконтролировать будет сложно. Правда забыл сказать, что к изначальной проблеме это никакого отношения не имеет. Отсюда я по крайней мере для себя делаю вывод, что в проекте должен быть хотя бы один общий инклюд, который будет подключается в КАЖДЫЙ файл проекта (у меня это что-нибудь типа defines.h)
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
08.07.2017, 14:30
Цитата Сообщение от Evg Посмотреть сообщение
хотя бы один общий инклюд, который будет подключается в КАЖДЫЙ файл проекта
Один, который включается во все файлы, и один, в который включаются все файлы, несколько разные случаи.
Да, Ваш случай к изначальной проблеме не очень подходит. Поэтому и "поругались". <здесь улыбка>
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.07.2017, 23:11
Цитата Сообщение от Evg Посмотреть сообщение
когда пытаешься минимизировать подключение хидеров.
обычная практика для "кейса с предварительного скомпилированным заголовков".

суть такая:
наши хедера вообще ничего к себе не инклюдям.
инклюдиться все должно в спп файле.

и что бы кто нибудь чего нибудь не профакапил,
юзается следующий дизайн:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// stream_help.h
 
#pragma once
 
#ifdef dUSING_PRECOMPILED_HEADER
    #ifndef _STDEXCEPT_
        #error #include <stdexcept> first
    #endif
    #ifndef _FSTREAM_
        #error #include <fstream> first
    #endif
    #ifndef _CODECVT_
        #error #include <codecvt> first
    #endif
    #ifndef _STRING_
        #error #include <string> first
    #endif
    #ifndef _TYPE_TRAITS_
        #error #include <type_traits> first
    #endif
    #ifndef dTOOLS_CONV_USED_
        #error #include <tools/conv.h> first
    #endif
#else
    #include <type_traits>
    #include <stdexcept>
    #include <fstream>
    #include <codecvt>
    #include <cassert>
    #include <string>
 
    #include <tools/conv.h>
#endif
 
#define dTOOLS_STREAM_HELP_USED_
 
...  // собственно сам хедер
а самым первым файликом в спп подключается
предварительно скомпилированный заголовок.

что позволяет объявлять всякие
заголовочные файлы и макросы в одном месте.
что делает профит для скорости компиляции.
и минимизирует возможность нарваться на всяческие ODR
и вообще, видно из чего проект состоит.

а если вдруг программист что-то где-то ничайно забыл,
то препроцессор ему услужливо напомнит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.07.2017, 23:11

Открытие окна "Управление сетевыми подключениями" из Командной строки
Как открыть диалог &quot;Управление сетевыми подключениями&quot; не мышкой, а из командной строки либо клавиатурной комбинацией?

Правильное использование include (PHP)
Если в пользовательском классе используются еще и другие классы (каждый хранится в отдельном файле), то где правильно размещать...

Чем отличается #include <cstring>, #include <string> и #include <string.h>?
Доброго времени суток :) Пишу свой класс и мне для нужны функции для работы со строками. Когда подключаю #include &lt;string&gt; все...

Распределение трафика между подключениями
Здравствуйте! У меня установлен 3G-модем и домашний интернет через маршрутизатор. При подключении через 3G модем, 3g-подключение...

Warning: include(1) [function.include]: failed to open stream: No such file or directory in
Выдает вот такую ошибку Warning: include(1) : failed to open stream: No such file or directory in...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru