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

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

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

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

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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.06.2016, 14:48
Ответы с готовыми решениями:

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

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

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

3
 Аватар для Vort_
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
20.06.2016, 18:18
Лучший ответ Сообщение было отмечено 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
 Аватар для vlisp
1061 / 982 / 153
Регистрация: 10.08.2015
Сообщений: 5,327
20.06.2016, 19:20
смысл хедеров в том, что в них описывается функционал, а сам функционал компилируется, чтоб не быть доступным для кривых ручеек, к тому же это ускоряет компиляцию
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.06.2016, 19:21
tvyxen, список тем, которые помогут полностью понять что происходит:
1) ODR (Правило одного определения): ссылка 1, ссылка 2.
2) Связывание (компоновка) внешнее, внутреннее: ссылка 1, ссылка 2, ссылка 3.

Пункты стандарта: 3.2, 7.1.1 и 7.1.2. Там же раскрываются тонкости насчет inline и шаблонов.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.06.2016, 19:21
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru