|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||
Что делает директива include в связке с pragma once?01.09.2023, 10:19. Показов 2012. Ответов 28
Здравствуйте,
Запутался совсем. Что делает команда #include ? Ну судя по тому, что говорит гугл - это простейшая операция скопировать-вставить, то есть берется весь код файла .cpp или .h и просто вставляется туда, где вызван #include - типа на этапе "препроцессора". Вроде бы понятно. Непонятен другой момент - есть необязательная для с++ команда компилятора "pragma once" или из стандарта:
Я не могу понять, эти команды не позволять включать код более, чем один раз в любой файл, в котором вызван #include ? Я это к тому, что говорят, что Only Header либы раздувают код, но ведь есть эти команды препроцессора, которые не позволяют включать код более одного раза ?
0
|
||||||
| 01.09.2023, 10:19 | |
|
Ответы с готовыми решениями:
28
Что делает директива #pragma Что делает директива #define ? Директива #pragma |
|
Модератор
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
|
|
| 01.09.2023, 10:46 | |
|
0
|
|
|
фрилансер
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
|
||
| 01.09.2023, 10:47 | ||
|
а #pragma once и/или гарды предотвращают повторные инклуды одного и того же файла внутри единицы трансляции
0
|
||
|
Комп_Оратор)
|
||||
| 01.09.2023, 10:57 | ||||
|
"//**********************/questions/1165740/почему-не-все-c-библиотеки-header-only" сайт не даёт опубликовать ссылку на стек оверфлоу) тогда фраг:
1
|
||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||
| 01.09.2023, 11:05 [ТС] | ||
|
"Единица трансляции" - это просто один файл ? Если да, то как внутри одного файла может оказаться несколько одинаковых нуклиидов?
0
|
||
|
Комп_Оратор)
|
|
| 01.09.2023, 11:06 | |
|
разбухание - от необходимости компилировать определение в каждой единице трансляции. У чистых шаблонов (без финтов с явным инстанцированием) нет адреса, это не объекты кода и их нельзя связать.
0
|
|
|
фрилансер
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
|
|||
| 01.09.2023, 11:07 | |||
|
1.cpp #include "1.h"Добавлено через 31 секунду
0
|
|||
|
Комп_Оратор)
|
||
| 01.09.2023, 11:10 | ||
|
На практике, повторное включение угрожает тогда когда есть ромбовидная структура включений. Один хедер включён в другой, а потом и он и другой включены в в какой-то сорс. Для исключения лишнего включения срабатывает страж.
1
|
||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|||||||
| 01.09.2023, 11:11 [ТС] | |||||||
|
Наверное все таки от такого случая:
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 01.09.2023, 11:23 | |
|
1
|
|
|
фрилансер
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
|
|||
| 01.09.2023, 11:35 | |||
|
0
|
|||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|
| 01.09.2023, 11:43 [ТС] | |
|
0
|
|
|
фрилансер
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
|
|
| 01.09.2023, 11:47 | |
|
Optimus11, инклудят заголовки, а единицы трансляции для этого не предназначены
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||
| 01.09.2023, 12:22 | ||
|
Я же вот вам в 20-м году давал ссылку, где все это разъясняется. Вы ее не смотрели?
1
|
||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||||||||||||||||
| 01.09.2023, 12:24 | ||||||||||||||||
|
Так много написано, и ни одного простого понятного примера. Сплошная терминология для тех, кто и так знает ответ.
Добавлено через 10 секунд --1.h--
--main.cpp--
Чтобы это предотвратить - и добавляют указанные защиты. Второй вариант - без защит - внимательно следить за руками и не включать заголовки те, которые уже есть во включеных h-файлах. Вообще, это философский вопрос: правильно (допустимо ли) инклудить одни h-файлы в другие? Я встречался с двумя школами: 1) да, в h-файл следует включить все те h-файлы, от которых он зависит. Это упрощает подключение h-файлов при использовании в cpp 2) категорически недопустимо использовать #include в р-файлах! Резон как раз в том, чтобы а) не было проблем с повторными включениями б) не раздувать код вот этими неочевидными вложенными включениями всего и вся. Теоретически я считаю, что подход школы 2) более правильный. Но он осложняется необходимостью очень хорошо проектировать h-файлы и необходимостью хорошо понимать в каком порядке требуется включать h-файлы в cpp, иначе если включить не в том порядке - то на момент компиляции 2.h мы еще не будем знать про Calss1 (в терминах приведённого выше примера), значит получим ошибку компиляции. Поэтому на практике чаще видим подход школы 1), это проще в использовании и не требует аккуратности при проектировании h-файлов.
1
|
||||||||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||||||||||||
| 01.09.2023, 12:35 | ||||||||||||
#include <string> описать этот класс в своем заголовочном файле?
Или вы что-то другое имели в виду?
0
|
||||||||||||
|
фрилансер
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
|
|
| 01.09.2023, 12:38 | |
|
0
|
|
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||||
| 01.09.2023, 12:53 [ТС] | ||||||||
|
Добавлено через 4 минуты
0
|
||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||||
| 01.09.2023, 13:13 | ||||
|
Это принуждает к порядку. Проблем при добавлении нового include - добавляет, да. Добавлено через 27 секунд
0
|
||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||||
| 01.09.2023, 13:30 | ||||
|
А, допустим, изменение заголовочного файла приведет к ручному изменению всех cpp, куда он добавлен, опять же со строгим соблюдением порядка. Эту идею можно конечно применять, например в сочетании с pimpl она хорошо работает, т.к. у такого pimpl-класса открытых зависимостей в принципе нет, поэтому и включать заголовочные файлы не обязательно. Однако тут уже вопрос применимости самого pimpl возникает, огульное его использование может серьезно помешать создать производительную программу. Короче говоря, в классической системе раздельной компиляции С\С++ этому подходу почти нет места. В серьезных проектах он выльется в колоссальные трудозатраты по сопровождению кода, потому что по сути мы забрали у компилятора его работу и делаем ее теперь вручную. Добавлено через 1 минуту
2
|
||||
| 01.09.2023, 13:30 | |
|
Помогаю со студенческими работами здесь
20
Директива препроцессору #pragma
директива #pragma. модификатор volatile. и функция system() Чертовщина с #include guards и #pragma once Директива #include Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|