Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/121: Рейтинг темы: голосов - 121, средняя оценка - 4.50
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420

Подключение .h и .cpp файлов к проекту

10.06.2016, 20:28. Показов 23309. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я запутался в элементарном. Но всё по порядку. Создал проект. Автоматически был создан файл Unit1.cpp.
Я добавил два файла dat.h и dat.cpp, которые заполнил кодом, а в Unit1.cpp добавил:
#include "dat.h"
#include "dat.cpp"
и создал обработчик FormCreate().
При компиляции выдаётся ошибка:
[C++ Error] dat.cpp(4): E2141 Declaration syntax error
но там (dat.cpp) всё правильно, может быть неверно подключил файлы?
Вот файлы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//--------------- Unit1.cpp ---------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "dat.h"
#include "dat.cpp"
 
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ShowMessage(IntToStr(stud[0].age/2));
}
 
//--------------- dat.h ---------------
#ifndef DAT_H
#define DAT_H
 
#define LN 50
#define N   3
 
typedef struct
{
  char name1[LN];
  char name2[LN];
  int age;
  double weight;
} univer;
 
int F1(int n);
 
#endif
 
//--------------- dat.cpp ---------------
#include "dat.h"
 
//Инициализация массива структуры
univer stud[N]={
{"Иванов", "Иван", 25, 72.5},
{"Петров", "Саша", 20, 80.0},
{"Сидоров", "Олег", 23, 75.1}
};
//---------------
int F1(int n)
{
  return n/2;
}
//---------------
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.06.2016, 20:28
Ответы с готовыми решениями:

Подключение файлов к проекту
Всем доброе время суток! У меня в проекте много функций и я решил из разбросать по темам в отдельные cpp-файлы с записью прототипов...

Подключение и удаление файлов к проекту
Раньше я не знал, что такое cpp-файлы и их не использовал: всё лепил(и описания и объявления) в *.h, а сами *.h инклюдами подключал в...

Подключение cpp файла
Всем привет! Хочу подключить файл Evidence.cpp в проект. Пишу в main.cpp: #include&quot;Evidence.cpp&quot; Вот такая ошибка...

10
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
10.06.2016, 23:18
Лучший ответ Сообщение было отмечено Инженер_3 как решение

Решение

подключать надо только h-файл. cpp просто должен быть добавлен в проект.

Нажми ctrl+F12. Если этот юнит есть в списке, значит только подключай h-файл. Если его там нет, то нажми shift+F11 и добавь.

Добавлено через 8 минут
и
C++
1
2
3
4
5
univer stud[N]={
{"Иванов", "Иван", 25, 72.5},
{"Петров", "Саша", 20, 80.0},
{"Сидоров", "Олег", 23, 75.1}
};
перенеси в dat.h
1
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
11.06.2016, 10:04  [ТС]
Lelik-pahan, Получается, что в h-файлах только объявления (функций, структур, статических массивов, глоб.переменных) и инициализация (статических массивов и структурных переменных/массивов).
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33377 / 21501 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
11.06.2016, 12:17
Лучший ответ Сообщение было отмечено Инженер_3 как решение

Решение

Цитата Сообщение от Lelik-pahan Посмотреть сообщение
перенеси в dat.h
Это еще зачем?

Достаточно вынести в h-файл только extern-описание:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef DAT_H
#define DAT_H
 
#define LN 50
#define N   3
 
typedef struct
{
  char name1[LN];
  char name2[LN];
  int age;
  double weight;
} univer;
 
int F1(int n);
 
extern univer stud[N]; // <---
 
#endif
, а сам массив оставить в cpp-файле.
2
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
11.06.2016, 19:51
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Получается, что в h-файлах только объявления
В этом и есть смысл h-файла.

Из википедии:В языках программирования Си и C++ заголовочные файлы — основной способ подключить к программе типы данных, структуры, прототипы функций, перечислимые типы и макросы, используемые в другом модуле. По умолчанию используется расширение .h; иногда для заголовочных файлов языка C++ используют расширение .hpp.

(конец цитаты, дальше уже не википедия)

А вот глобальные переменные (в т.ч. массивы, экземпляры классов и структур и т.д.) в них лучше не объявлять (каюсь, в предыдущем посте дал плохой совет ).
Если объявить в h-файле переменную x и затем подключить этот h-файл в двух cpp, то для каждого cpp будет создан свой x, и значения в них никак не будут связаны.

Цитата Сообщение от volvo Посмотреть сообщение
Достаточно вынести в h-файл только extern-описание
Да, это я плохо подумавши написал.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
13.06.2016, 17:30  [ТС]
Вот(ниже) коды моих функций. Инициализацию структуры из dat.cpp(там уже ничего нет) перенёс в dat.h
Всё работает нормально, но выскакивают два предупреждения:
[C++ Warning] dat.h(16): W8058 Cannot create header: initialized data in header
[Linker Warning] Public symbol '_stud' defined in both module C:\...\UNIT1.OBJ and C:\...\DAT.OBJ

Может я неправильно создавал dat.h ?
Я делал так: "File" -> "New" -> "Other" -> окошко "New Items", выбрал "Header File" и
жму "Ok". Создаётся Unit2.h, который переименовываю в dat.h при сохранении проекта в
диалоговом окне.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//-------------- Unit1.cpp ----------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "dat.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//--------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ShowMessage(IntToStr(stud[0].age/2));
}
//-------------- dat.h ----------------
#ifndef DAT_H
#define DAT_H
 
#define LN 50
#define N   3
 
typedef struct
{
  char name1[LN];
  char name2[LN];
  int age;
  double weight;
} univer;
 
//Инициализация массива структуры
univer stud[N]={
{"Иванов", "Иван", 25, 72.5},
{"Петров", "Саша", 20, 80.0},
{"Сидоров", "Олег", 23, 75.1}
};
 
#endif
//------------------------
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33377 / 21501 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
13.06.2016, 17:46
Ну вот я просто так писал 4-ый пост? Там написано, что нужно сделать.
Файл dat.cpp остается таким же, как и в первом посте темы.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
13.06.2016, 21:12  [ТС]
volvo, до меня с трудом дошло, что можно инициализировать уже объявленную переменную.
Но всё работает, спасибо.
0
 Аватар для Tlya
16 / 16 / 10
Регистрация: 20.11.2015
Сообщений: 305
23.04.2017, 18:00
У меня похожий вопрос, только не ругайте сильно, я новичок
Создал класс в отдельном файле (кстати, правильно создавать класс в .h или .cpp?)
C++
1
2
3
4
5
6
7
8
9
10
11
class SUCHNOST{
    SUCHNOST(){
    }
    private:
    int one=0;
    public:
    int setOne(int chislo){
    one = chislo;
    return one;
    }
};
и пытаюсь подключить его в форму, но не выходит...
C++
1
2
3
4
5
void __fastcall TForm1::Button1Click(TObject *Sender)
{
G_class cl;
cl.setOne(2);
}
Undefined symbol 'G_class'
п.с. в MVS это получилось, а в Embarcadero Builder-е почему-то нет
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
23.04.2017, 19:30
Tlya, класс называется SUCHNOST. Откуда взялся тип G_class ?
C++
1
2
SUCHNOST cl;
cl.setOne(2);
0
 Аватар для Tlya
16 / 16 / 10
Регистрация: 20.11.2015
Сообщений: 305
23.04.2017, 19:37
Lelik-pahan, Как стыдно то за свою невнимательность...)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.04.2017, 19:37
Помогаю со студенческими работами здесь

Подключение к проекту своей библиотеки
Я хочу свои процедуры и функции подключать к проекту через #include &lt;myfunc.h&gt; Функции объявляю в файле myfunc.h, расположенный по адресу...

Подключение к проекту x64 библиотеки
Здравствуйте. Есть DLL 64 битная. То есть обычный implib его не возьмёт(на выходе получается файл весом 1Kb). Нагуглилась альтернатива...

Подключение библиотеки ffmpeg к проекту
Здравствуйте. Я начал разбираться с библиотекой ffmpeg. Но не пойму как ее можно подключить к проекту в С++ и можно ее подключить и...

Подключение к проекту Skype4com.dll
Не знаю как подключать динамические библиотеки к проекту, чтобы потом с ними работать... Подскажите как

Один *.h и несколько *.cpp файлов - Linker Warning
Добрый день! Уважаемые эксперты, Если сталкивались с такой проблемой, подскажите пожалуйста, как её решить. У меня в проекте...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru