![]() 215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
|
||||||
Чем опасно множественное подключение библиотеки к программе?15.04.2019, 16:33. Показов 3864. Ответов 18
Метки библиотека (Все метки)
Добрый день. Хочу задать вопрос касательно своего проекту.
У меня есть структура, например структура фрукта, которая отведена в отдельный файл-хедер вместе внутренними функциями. Также есть библиотека, в которой написаны функции для работы с массивом фруктов и библиотека, в которой написаны функции для работы с бинарным файлом (файловая база данных). В последних двух либах подключена библиотека структуры и обе они подключены к программе. Схематически выглядит это примерно так:
Как это может сказаться на проекте? Хорошо это или плохо? Как можно это исправить? Спасибо.
1
|
15.04.2019, 16:33 | |
Ответы с готовыми решениями:
18
Подключение библиотеки к программе
Чем опасно высокое напряжение? |
![]() 4051 / 2602 / 432
Регистрация: 09.09.2017
Сообщений: 11,577
|
|||||||||||
15.04.2019, 17:13 | |||||||||||
![]() Решение
Это совершенно нормально, и чтобы не получать негативные последствия, придумали такую штуку как защитные define'ы:
some_file.h
Лучше ее использовать совместно с защитными define'ами, друг другу они не мешают.
1
|
Mental handicap
![]() 1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
15.04.2019, 17:27 | |
1
|
![]() 1663 / 492 / 106
Регистрация: 17.05.2015
Сообщений: 1,502
|
||||||||||||||||
15.04.2019, 17:37 | ||||||||||||||||
![]() Решение
Проблема не в портабельности.
Прагму поддерживают все промышленные компиляторы. Проблема прагмы в принципе действия самой прагмы. Когда компилятор видит:
В следующий раз он уже не подключит заголовок связанный с этим файлом. Однако, если у вас в проекте два разных файла с одним и тем же содержимым, то #pragma once его благополучно пропустит,и тогда вы будете ловить ошибки из-за множественного определения (в лучшем случае), либо глюки из-за ошибок ODR (в худшем случае). Пример: Нужно покрыть юнит-тестами header-only библиотеку stringed.h Однако, этот файл включен в состав Google Test Framework. Получается: Одна копия файла цепляется вместе с gtest:
которую нужно протестировать:
Но это - два разных файла. В результате - ошибка множественного определения. Гварды на дефайнах пропроцессора не страдают от такого деффекта. Я всегда так делаю)
4
|
![]() 215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
|
||||||
15.04.2019, 17:50 [ТС] | ||||||
Если я правильно Вас понял, то в моей библиотеке "Fruit_Array.h" в начале должны быть такие строки:
FRUIT_ARRAY_H отвечает?
1
|
![]() ![]() ![]() |
|
15.04.2019, 18:01 | |
Если у тебя в разных каталогах есть файлы с одним и тем же именем file.h, и его ты защитил макросом с одним и тем же именем FILE_H, то пострадают
Добавлено через 1 минуту https://www.cyberforum.ru/faq/... ost4134774
0
|
15.04.2019, 18:04 | |
0
|
![]() 4051 / 2602 / 432
Регистрация: 09.09.2017
Сообщений: 11,577
|
|
15.04.2019, 19:08 | |
Просто константа, которую вы объявляете (#define) если она не была объявлена кем-то раньше.
Идея в том, что при начале компиляции не объявлено ни одной макроконстанты. При первом включении fruit_array.h компилятор (вообще-то, препроцессор, но не важно) смотрит объявлена ли FRUIT_ARRAY_H. Она не объявлена, так что выполняется тело #ifndef. Первой же операцией эта константа объявляется, так что при следующем включении компилятор посмотрит #ifndef FRUIT_ARRAY_H и, поскольку условие ложное, не станет включать тело #if'а. Наверное, имеется в виду два файла с разным содержимым и одинаковыми гвардами. Тогда будет включен только первый, а второй потеряется.
2
|
Комп_Оратор)
![]() ![]() |
|
15.04.2019, 19:34 | |
Это изврат (имхо). Хотя если больше нечего, то... Но это крайний случай. JohnBlack123, тело оствим в покое. Директива
#include не выполнится если условие компиляции не позволит.
1
|
![]() 215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
|
||||||
15.04.2019, 19:45 [ТС] | ||||||
Не спорю, а вот википедия так не думает.
Они приводят пример своей библиотеки "grandparent.h" и пишут для нее такой код:
0
|
![]() 1710 / 1110 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
|
||||||
15.04.2019, 19:49 | ||||||
![]() Решение
В большинстве случаев - да. (если не требуется что-то хитрозадое, придумать пример не могу даже)
Оно и определяется именем файла для уникальности обычно
Касательно #pragma once - никогда не использую, хотя VS предлагает иногда
1
|
![]() 215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
|
|
15.04.2019, 19:55 [ТС] | |
Folian, Получается реализовав для каждой либы
include guard , я могу обезопасить ошибки их множественного определения в Main.cpp и могу не боясь использовать их. Верно? ![]() Или же достаточно будет сделать это в хедере со структурой? Спасибо!
0
|
Комп_Оратор)
![]() ![]() |
|
15.04.2019, 20:37 | |
Добавлено через 2 минуты
Это обычно инклудят хотя вручную тоже можно, в принципе. Сути это не меняет.
0
|
15.04.2019, 20:37 | ||||||
Помогаю со студенческими работами здесь
19
Чем опасно использовать Denwer в сети? Множественное подключение к БД Чем опасно создавать вектор инициализации и секретный ключ для алгоритма симметричного шифрования самому Множественное подключение к БД Access Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи
![]() |
||||
Работа с объемным DOM в javascript
Htext 04.04.2025
Сегодня прочитал статью тут о расходах памяти в JS, ее утечках и т. п. И вот что вспомнил из своей недавней практики. Может, кому пригодится. Хотя, в той статье об этом тоже есть.
Дело в том, что я. . .
|
Оптимизация производительности Node.js с помощью кластеризации
run.dev 04.04.2025
Масштабирование приложений для обработки тысяч и миллионов запросов — обыденная задача для многих команд. Node. js, благодаря своей асинхронной событийно-ориентированной архитектуре, стал популярной. . .
|
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
|
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
|
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
|
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
|
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
|
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
|
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
|
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
|