подключение h-файлов
Создал для себе небольшой модуль с функциями. Объявление функций в head-файлах, реализация - в *.cpp. В общем, все как положено. Проблема в следующем: когда я в другом проекте подключаю свой модуль (head-файл), линковщик выдает ошибку. Приходится включать в проект также и файл реализации функций. Как этого избежать??
А чего ты хочешь собственно избежать?
Для компиляции программы head файла недостаточно (если конечно ты в нем не напишешь реализацию того чего в нем объявлено).
head файл собственно служит для определения прототипов того чего будет компиляться. А компиляется уже как-раз .cpp. Если ты его не подключишь - собственно и компиляться ничего не будет. Соответсвенно и получаешь то о чем пишешь.
Можешь конечно не таскать .cpp - таскать его объектник (.obj) - или скомпиляй либу (.lib). Но не проще-ли просто подключить к новому проекту готовый .cpp?
Создал для себе небольшой модуль с функциями. Объявление функций в head-файлах, реализация - в *.cpp. В общем, все как положено. Проблема в следующем: когда я в другом проекте подключаю свой модуль (head-файл), линковщик выдает ошибку. Приходится включать в проект также и файл реализации функций. Как этого избежать??
А *.h файл не нужно подключать к проекту. Нужно подключать *.cpp, *.obj, *.lib (как уже было сказано ddnh_bc). *.h файл используется так
А *.h файл не нужно подключать к проекту. Нужно подключать *.cpp, *.obj, *.lib (как уже было сказано ddnh_bc). *.h файл используется так
Хорошо, допустим. Но ведь когда я использую библиотеки MFC или даже стандартные, например "iostream". Я ведь не подключаю никаких *.cpp файлов, а просто пишу вначале #include "iostream.h". Хотя реализация, я так понимаю, у них находится отдельно, в файлах *.cpp
Хорошо, допустим. Но ведь когда я использую библиотеки MFC или даже стандартные, например "iostream". Я ведь не подключаю никаких *.cpp файлов, а просто пишу вначале #include "iostream.h". Хотя реализация, я так понимаю, у них находится отдельно, в файлах *.cpp
Дорогой товарищ!
А что есть собственно MFC? Или стандартные библиотеки? Как и все SDK это набор уже скомпилированных *.lib файлов с набором прототипов определенных в .h файлах. В любом проекте открой Project Settings - закладочку Link и посмотри Object/Library modules. Не для красоты же они там присутствуют....
Это все библиотеки, используемые линковщиком при сборке твоего проекта в .exe файл. Это как раз те самые .cpp файлы предварительно скомпилированные в библиотеки из которых линковщик вынимает нужные куски и вставляет в *.exe. Вот собственно и все. Ничего тайного.
Просто сам подумай - данные из воздуха не берутся.
Они где-то в любом случае должны быть. Это база. Уж такие-то вещи нужно знать.
Хорошо. Тогда резонный вопрос: как я могу создать свою библиотеку?
File->New->Projects->Win32 static library.
Вопрос можно? А зачем тебе столько гемора ради одного файла? Ты дольше с либой возиться будешь - судя по вопросам которые задаешь. Поверь на слово - подключить 1 файл к новому проекту гораздо легче. Если конечно у тебя в нем не 1 МБ текстового кода, что без либы уж прям никуда.
File->New->Projects->Win32 static library.
Вопрос можно? А зачем тебе столько гемора ради одного файла? Ты дольше с либой возиться будешь - судя по вопросам которые задаешь. Поверь на слово - подключить 1 файл к новому проекту гораздо легче. Если конечно у тебя в нем не 1 МБ текстового кода, что без либы уж прям никуда.
А как же принципы инкапсуляции? Пользователь должен знать только то, что он знать должен и ничего, кроме этого :)
А как же принципы инкапсуляции? Пользователь должен знать только то, что он знать должен и ничего, кроме этого :)
Ты это пишешь для внутреннего пользования или это предпологается end-user SDK? Если второе - тогда уж разбирайся как либы делать - либо таскай вместо *.cpp его объектник *.obj. А если для внутреннего - еще раз повторюсь - зачем лишний гемор на задницу?
чё папало отвечали.
Вообще, понятно чё тебе надо:
- в хедоре написать итерфейс
- в .cpp реализацию, причём не в основном .cpp,
а в другом: делается это так:
У тебя есть основной исходник main.cpp,
та подключаешь к нему свой хедер
(пусть name1.hpp.)в нём у тебя обьявлены класс или функции.
затем создаёшь name1.cpp (имя такое же).
и в нутри него тоже подключай name1.hpp.
У тебя есть основной исходник main.cpp,
та подключаешь к нему свой хедер
(пусть name1.hpp.)в нём у тебя обьявлены класс или функции.
затем создаёшь name1.cpp (имя такое же).
и в нутри него тоже подключай name1.hpp.
Спасибо. Только я так понял, надо, наоборот, в name1.hpp подключать name1.cpp. Причем имя необязательно должно совпадать. Получается как будто пишем реализацию прямо в h-файл, но пользователь видит только интерфейс :)
Но здесь возникает другая проблема: локальные функции моего cpp-файла будут открыты, а значит, возможны конфликты имен. Как это можно избежать?
Если локальные ф-ии не определены в hpp файле, тогда они не открыты.
Конфликт имен можно избежать используя namespace.
Namespace я и использую. Но некоторые функции хотелось бы сделать невидимыми для пользователя. Есть ли в namespace'ах методы для этого (например, как private для классов)?
Не, не так. Никогда не делай #include "*.cpp".
Вот щас понятней попробую:
//main.hpp:
#include <.....h>
#include <.....h>
#include <.....h>
.........
//main.cpp
#include "main.hpp"
#include "name1.h"
......
//name1.hpp:
#include "main.hpp"
......
//name1.cpp:
#include "name1.hpp"
Вот вроде так. Постороаюсь к завтрому у себя пример рабочий поприличней найти и здесь выложу.
2 kupyxa
<...>
Вот вроде так. Постороаюсь к завтрому у себя пример рабочий поприличней найти и здесь выложу.
Попробовал - не работает :(
Ты хотел пример показать??
Попробовал - не работает :(
Ты хотел пример показать??
Эх, чуть не забыл :-)
Вот - я не оригинален, Hello World и сумма
двух чисел из другог *.cpp