Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
06.09.2013, 20:18     Контроль включаемых заголовочных файлов #1
Всем привет!

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

Отличие заголовочных файлов C++
Подключение заголовочных файлов C++
Подключение заголовочных файлов. C++
C++ Объявление заголовочных файлов
слишком много включаемых файлов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.09.2013, 20:22     Контроль включаемых заголовочных файлов #2
Цитата Сообщение от BESSON_off Посмотреть сообщение
Допустим подключаю я заголовочный файл, который содержит в себе инклуд иострима, после чего подключаю другой заголовочный файл и там тоже есть инклуд иострима и хотелось бы, чтобы второй раз иострим при компиляции не прописывался...
iostream и так будет один раз "подключён" препроцессором.
gromo
 Аватар для gromo
366 / 265 / 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
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
06.09.2013, 20:51  [ТС]     Контроль включаемых заголовочных файлов #4
Вот это ответ так ответ... Спасибо!
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
06.09.2013, 20:59     Контроль включаемых заголовочных файлов #5
gromo,
только ты забыл добавить что это действует для одной единицы трансляции ( грубо говоря для одного С файла)
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
06.09.2013, 21:05     Контроль включаемых заголовочных файлов #6
Цитата Сообщение от ValeryS Посмотреть сообщение
только ты забыл добавить что это действует для одной единицы трансляции ( грубо говоря для одного С файла)
В каждой единице трансляции должно быть по копии заголовочного файла с интерфейсом. По-другому, насколько я знаю, никак. Ведь каждый файл с исходным текстом обрабатывается по очереди и на этапе линковки интерфейсная часть о где-то в каком-то исходном файле включаемая из заголовочных файлов уже потеряна.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
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 раза
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
06.09.2013, 21:19     Контроль включаемых заголовочных файлов #8
ValeryS,
Цитата Сообщение от ValeryS Посмотреть сообщение
и приятно удивись, "переменная s объявлена 2 раза
Простите, я сгоряча написал и опубликовал ответ на неверную интерпретацию вашего замечания, и почти сразу же отредактировал пост. А вы еще застали старый вариант и ответили. Обновите страничку
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2013, 21:43     Контроль включаемых заголовочных файлов #9
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй такой вариант
Вывод: не нужно делать определения в заголовочных файлах, иначе никакая защита не поможет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2013, 22:03     Контроль включаемых заголовочных файлов
Еще ссылки по теме:

C++ Ошибка: слишком много включаемых файлов
Подключение заголовочных файлов C++
C++ Ошибка : слишком много включаемых файлов

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
06.09.2013, 22:03     Контроль включаемых заголовочных файлов #10
gromo, Ну вот теперь все верно
просто я сам наступал на эти грабли по началу и никак не мог понять почему у меня файл включается много раз
потом почитал как работает компилятор и все понял, но это было так давно
Цитата Сообщение от alsav22 Посмотреть сообщение
Вывод: не нужно делать определения в заголовочных файлах, иначе никакая защита не поможет.
воистину
но если пишешь проект с одним main.c то поначалу можешь этого не заметить
а потом два, три ... файла, и понеслось
сколько тем уже было
Yandex
Объявления
06.09.2013, 22:03     Контроль включаемых заголовочных файлов
Ответ Создать тему
Опции темы

Текущее время: 11:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru