|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
04.08.2014, 21:11 | #11 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,777
|
А у Сей разве есть понятие единицы трансляции? С этими вашими заголовочниками получается скорее поток трансляции безо всяких единиц. А директивы extern сотоварищи привязаны к границам файла, чтобы компилятор не ругался почем зря.
|
04.08.2014, 21:19 | #12 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Прошел препроцессор, заменил все инклуды на содержимое хедеров. Каждая единица оттранслировалась, получился набор объектных файлов. Прошел линкер, слил все объектные файлы в кучу. Что не так? |
|
04.08.2014, 23:42 | #13 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Общие заголовки.
Конечно, у каждой единицы трансляции "все своё". В частности, на местах включений файлов, исходный код тупо подставляется, и для каждой очередной единицы заново компилируется. Однако, сами хэдэры получаются общими для разных единиц трансляции. Кроме того, действует правило одного определения - разные единицы трансляции могут подключать к себе объявления из общего заголовка, но не определения. Определение может быть только одним. Вдумайтесь в эту формулировку. существовать определение будет по факту в единственном экземпляре. Теперь я задам вам ровно один вопрос: Много-файловый проект имеет следующую структуру: project | |----include | |----- example.h | |------src | |----- main.cpp | |----- a.cpp | |----- b.cpp содержимое example.h : Код:
Код:
Код:
Код:
Резюмируя: У разных единиц трансляции могут быть общие файлы-хэдэры, которые содержат общие заголовки функций и классов. Даже не смотря на то, что из-за шаблонов компиляторы с++ были вынуждены позволить определять функции при объявлении, тем не менее, эти определения как и в языке си подчиняются правилу единства определения - существуют в единственном экземпляре, но при этом являются общими для многих единиц трансляций. Что означает: вы можете позвать эту функцию из любой единицы трансляции, которой известен заголовок этой функции. И если функция была определена - она будет запущена. А если ни одного определения не существует - только тогда будет ошибка линкера, не компилятора. |
05.08.2014, 05:08 | #14 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Да хрен его знает. Наверное "BBB". Это если порядок обработки файлов определяется их порядком в файле проекта. Но скорее всего стандарты это не регламентируют.
ну либо "mainAB" если define не глобально определяет... (я не уверен, не пользуюсь я дефайном xD). |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проектирование компилятора | rusfin01 | Фриланс | 0 | 15.04.2013 22:11 |
Создание компилятора | Jaksn | Помощь студентам | 7 | 31.01.2013 22:46 |
Разработка компилятора | Чай_ник | Помощь студентам | 20 | 17.01.2011 17:25 |
Определение компилятора | AltF4 | Общие вопросы C/C++ | 4 | 11.08.2009 11:11 |
Исходники компилятора | Simply-Art | Свободное общение | 1 | 08.07.2008 13:17 |