Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
#1

Контроль включаемых заголовочных файлов - C++

06.09.2013, 20:18. Просмотров 528. Ответов 9
Метки нет (Все метки)

Всем привет!

У меня родился следующий вопрос: как можно сделать так, чтобы подключаемый файл, при условии, что он уже был ранее подключен, не подключался второй (третий, четвертый...) раз? Допустим подключаю я заголовочный файл, который содержит в себе инклуд иострима, после чего подключаю другой заголовочный файл и там тоже есть инклуд иострима и хотелось бы, чтобы второй раз иострим при компиляции не прописывался... Есть что то подобное из коробки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2013, 20:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Контроль включаемых заголовочных файлов (C++):

Про добавление заголовочных файлов в заголовочных файлах - C++
В который раз эта вещь засовывает мозги в блендер! Я про то, что не могу однозначно запомнить (основываясь на моих знаниях о директиве...

Ошибка: слишком много включаемых файлов - C++
Народ подскажите что могло случится с Microsoft Visual C++ 2010 экспресс выпуск. До этого как установил всё нормально работал и...

Ошибка : слишком много включаемых файлов - C++
Здравствуйте! Помогите, пожалуйста, исправить ошибку( С1014 слишком много включаемых файлов). Не знаю, где лишние .h файлы убрать....

Fatal error C1014: слишком много включаемых файлов - C++
вот код, пишет что "1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(2) : fatal error C1014: слишком много включаемых...

Раздельная компиляция (нюансы использования заголовочных файлов и файлов реализации) - C++
Почему во многих учебниках функции-члены класса внутри класса только объявляют, но определяют вне самого класса (не, ну как бы в классе, но...

Подключение заголовочных файлов и файлов реализации - C++
Здравствуйте,при создании класса в visual studio руками не компилится проект,при создании через add class все работает,для примера написал...

9
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
06.09.2013, 20:22 #2
Цитата Сообщение от BESSON_off Посмотреть сообщение
Допустим подключаю я заголовочный файл, который содержит в себе инклуд иострима, после чего подключаю другой заголовочный файл и там тоже есть инклуд иострима и хотелось бы, чтобы второй раз иострим при компиляции не прописывался...
iostream и так будет один раз "подключён" препроцессором.
0
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
06.09.2013, 20:27 #3
Файлы из стандартной библиотеки гарантированно не будут подключаться дважды. В них используется простой, и в то же время, действенный механизм, который и вам советую использовать: конструкция http://ru.wikipedia.org/wiki/Include_guard
например:

C
1
2
3
4
5
6
7
8
9
//начинайте все свои заголовочные файлы так
#ifndef NAMEOFYOURHEADER_H
#define NAMEOFYOURHEADER_H
/*
 *
 * Contents of file
 *
 */ 
#endif /* NAMEOFYOURHEADER_H */
Таким образом, препроцессор будет обрезать от повторной компиляции заголовочный файл, который уже был так определен (как выше).
Подробнее по ссылке в Википедию
Также очень советую прочитать этот блог, чтобы раз и навсегда забыть о трудностях с директивами препроцессора http://www.cyberforum.ru/blogs/18334/blog100.html
1
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
06.09.2013, 20:51  [ТС] #4
Вот это ответ так ответ... Спасибо!
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,232
06.09.2013, 20:59 #5
gromo,
только ты забыл добавить что это действует для одной единицы трансляции ( грубо говоря для одного С файла)
0
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
06.09.2013, 21:05 #6
Цитата Сообщение от ValeryS Посмотреть сообщение
только ты забыл добавить что это действует для одной единицы трансляции ( грубо говоря для одного С файла)
В каждой единице трансляции должно быть по копии заголовочного файла с интерфейсом. По-другому, насколько я знаю, никак. Ведь каждый файл с исходным текстом обрабатывается по очереди и на этапе линковки интерфейсная часть о где-то в каком-то исходном файле включаемая из заголовочных файлов уже потеряна.
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,232
06.09.2013, 21:12 #7
Цитата Сообщение от gromo Посмотреть сообщение
А это что?
а ничего
попробуй такой вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//tst.h
#ifndef TST_H
#define TST_H
int s=0;
#endif
 
//tst1.c
#include "tst.h"
void fnk1()
{
int c=s;
}
 
 
//tst2.c
#include "tst.h"
void fnk2()
{
int b=s;
}
и приятно удивись, "переменная s объявлена 2 раза
0
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
06.09.2013, 21:19 #8
ValeryS,
Цитата Сообщение от ValeryS Посмотреть сообщение
и приятно удивись, "переменная s объявлена 2 раза
Простите, я сгоряча написал и опубликовал ответ на неверную интерпретацию вашего замечания, и почти сразу же отредактировал пост. А вы еще застали старый вариант и ответили. Обновите страничку
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2013, 21:43 #9
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй такой вариант
Вывод: не нужно делать определения в заголовочных файлах, иначе никакая защита не поможет.
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,232
06.09.2013, 22:03 #10
gromo, Ну вот теперь все верно
просто я сам наступал на эти грабли по началу и никак не мог понять почему у меня файл включается много раз
потом почитал как работает компилятор и все понял, но это было так давно
Цитата Сообщение от alsav22 Посмотреть сообщение
Вывод: не нужно делать определения в заголовочных файлах, иначе никакая защита не поможет.
воистину
но если пишешь проект с одним main.c то поначалу можешь этого не заметить
а потом два, три ... файла, и понеслось
сколько тем уже было
0
06.09.2013, 22:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2013, 22:03
Привет! Вот еще темы с ответами:

Иерархия заголовочных файлов - C++
Вопрос такой. Есть 2 заголовочных файла с классами: core.h interface.h В core.h происходит #include interface.h В...

Назначение заголовочных файлов - C++
Я читала учебник и википедию - никак не доходит. В общем, может я неправильно поняла: есть у меня "Моя программа.cpp", и есть...

Подключение заголовочных файлов - C++
Итересует меня вопрос : нужно ли при компиляции программ оставлять только нужные хэдеры ? т.е. их минимальное кол-во для корректной...

Подключение заголовочных файлов - C++
Здравствуйте. Возникают ошибки при компиляции проекта: 1. Указывает на указатель: 2. Указывает на указатель и коллекцию указателей: ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.