Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2014, 21:11   #11
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
А вот хэдэр - это заголовок, который может быть один на несколько единиц трансляций.
А у Сей разве есть понятие единицы трансляции? С этими вашими заголовочниками получается скорее поток трансляции безо всяких единиц. А директивы extern сотоварищи привязаны к границам файла, чтобы компилятор не ругался почем зря.
Vapaamies вне форума Ответить с цитированием
Старый 04.08.2014, 21:19   #12
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
А у Сей разве есть понятие единицы трансляции? С этими вашими заголовочниками получается скорее поток трансляции безо всяких единиц. А директивы extern сотоварищи привязаны к границам файла, чтобы компилятор не ругался почем зря.
Ниче не понял. Что за поток трансляции без единиц? Хедеры в трансляции ваще не участвуют.

Прошел препроцессор, заменил все инклуды на содержимое хедеров.
Каждая единица оттранслировалась, получился набор объектных файлов.
Прошел линкер, слил все объектные файлы в кучу.

Что не так?
rrrFer вне форума Ответить с цитированием
Старый 04.08.2014, 23:42   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Это как?
У единиц трансляций нет ничего общего. У каждой все свое.
Общие заголовки.

Конечно, у каждой единицы трансляции "все своё". В частности, на местах включений файлов, исходный код тупо подставляется, и для каждой очередной единицы заново компилируется.

Однако, сами хэдэры получаются общими для разных единиц трансляции.
Кроме того, действует правило одного определения - разные единицы трансляции могут подключать к себе объявления из общего заголовка, но не определения. Определение может быть только одним.

Вдумайтесь в эту формулировку.

существовать определение будет по факту в единственном экземпляре.


Теперь я задам вам ровно один вопрос:

Много-файловый проект имеет следующую структуру:

project
|
|----include
| |----- example.h
|
|------src
| |----- main.cpp
| |----- a.cpp
| |----- b.cpp

содержимое example.h :

Код:
#pragma once

#include <iostream>
using namespace std;

struct example
{
    void view()const
    {
        MACRO_VIEW;
    }
};

void viewA();
void viewB();
содержимое a.cpp :
Код:
#define MACRO_VIEW cout<<"A\n";
#include "example/example.h"
void viewA() { example().view(); }
содержимое b.cpp :
Код:
#define MACRO_VIEW cout<<"B\n";
#include "example/example.h"
void viewB() { example().view(); }
содержимое main.cpp :
Код:
#define MACRO_VIEW cout<<"main\n";
#include "example/example.h"

int main()
{
    example().view();
    viewA();
    viewB();
}
Что должно быть выведено на экран?

Резюмируя:
У разных единиц трансляции могут быть общие файлы-хэдэры, которые содержат общие заголовки функций и классов.

Даже не смотря на то, что из-за шаблонов компиляторы с++ были вынуждены позволить определять функции при объявлении, тем не менее, эти определения как и в языке си подчиняются правилу единства определения - существуют в единственном экземпляре, но при этом являются общими для многих единиц трансляций.

Что означает: вы можете позвать эту функцию из любой единицы трансляции, которой известен заголовок этой функции. И если функция была определена - она будет запущена. А если ни одного определения не существует - только тогда будет ошибка линкера, не компилятора.
_Bers вне форума Ответить с цитированием
Старый 05.08.2014, 05:08   #14
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Да хрен его знает. Наверное "BBB". Это если порядок обработки файлов определяется их порядком в файле проекта. Но скорее всего стандарты это не регламентируют.

ну либо "mainAB" если define не глобально определяет... (я не уверен, не пользуюсь я дефайном xD).
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проектирование компилятора 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