Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 05.05.2015
Сообщений: 2
1

Линковка, реализация в заголовочных файлах

20.06.2016, 14:48. Показов 1754. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ситуация следующая. Представим себет хедер, который содержит некоторый функционал и должен использоваться в нескольких проектах. Причем хедер содержит не только заголовки а и реализацию функций/классов. Например:

SharedHeader.h :
C++
1
2
3
4
5
6
#ifndef __SH
#define __SH
void Foo() {
    ...
}
#endif
И у меня есть два модуля, которые включают в себя этот хедер. Например:

Module1.h :
C++
1
2
3
4
#ifndef __M1
#define __M1
#include "SharedHeader"
#endif
Module1.cpp:
C++
1
#include "Module1.h"
Module2.h :
C++
1
2
3
4
#ifndef __M2
#define __M2
#include "SharedHeader"
#endif
Module2.cpp:
C++
1
#include "Module2.h"
Во время линковки возникает ошибка, так как в Module1.o и Module2.o дублируется Foo. Но если я так же само подключу в обоих модулях тот же boost, который состоит только из хедеров, содержащих реализацию - никаких проблем не возникает. Почему так происходит и как правильно проектировать подобные приложения.

PS: В каких случаях разделять код на .h и .cpp, а в каких случаях писать реализацию сразу в заголовочных файлах.

Огромная благодарность за любые ответы и ссылки на статьи, улучшающие понимание этой темы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2016, 14:48
Ответы с готовыми решениями:

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

Массивы в заголовочных файлах
в заголовочном файле в описании класса пишу: int _const_iMas = {0x63,0x7c,0x78,0x79}; В...

О стандартных заголовочных файлах
Не знаю в какую категорию отнести данное нубство, но все же: Часто использую некоторые...

Определение переменных в заголовочных файлах
Здорова! Определил переменную в заголовочном фале от так #pragma once #ifndef...

3
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
20.06.2016, 18:18 2
Лучший ответ Сообщение было отмечено tvyxen как решение

Решение

Интересное наблюдение:
Вот так работает:
C++
1
2
3
4
5
6
7
#ifndef __SH
#define __SH
class Bar {
public:
    void Foo() {
    }
};
Добавлено через 1 минуту
Вот так, кстати, тоже:
C++
1
2
inline void Foo() {
}
2
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
20.06.2016, 19:20 3
смысл хедеров в том, что в них описывается функционал, а сам функционал компилируется, чтоб не быть доступным для кривых ручеек, к тому же это ускоряет компиляцию
1
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
20.06.2016, 19:21 4
tvyxen, список тем, которые помогут полностью понять что происходит:
1) ODR (Правило одного определения): ссылка 1, ссылка 2.
2) Связывание (компоновка) внешнее, внутреннее: ссылка 1, ссылка 2, ссылка 3.

Пункты стандарта: 3.2, 7.1.1 и 7.1.2. Там же раскрываются тонкости насчет inline и шаблонов.
2
20.06.2016, 19:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.06.2016, 19:21
Помогаю со студенческими работами здесь

Статические свойства структур в заголовочных файлах
Всем привет. Не могу найти в интернете инфу о том, как ведут себя статические свойства структур...

Расположение определения функций в заголовочных файлах
grizlik78, Часто вижу что приватную секцию указывают внизу, интересно, зачем? Вроде удобнее...

Объявлние классов в разных заголовочных файлах
Приветствую всех участников форума. Есть 2 класса А и В. Каждый из содержит указатель на другой...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru