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

Visual C++ Разделение кода на несколько файлов

08.11.2017, 16:55. Показов 13081. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Помогите разобраться, как разбить код на несколько файлов?
Я только начинаю изучать этот язык. До этого изучал другие, более простые языки прог-я. Там это делалось легко. А вот на C++ все примеры, что я нашёл, описано очень сложно (с большим количеством кода).
Можно привести пример разделения из этого кода?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
void displayMSG1(void)
{
    cout << "Привет\n";
}
 
void displayMSG2(void)
{
    cout << "Как дела?\n";
}
 
int main()
{
    setlocale(LC_ALL, "RUS");
 
    displayMSG1();
    displayMSG2();
    system("pause");
}
Что бы функцию displayMSG1 разместить в 1-м файле .cpp а displayMSG2 соответственно во 2-м.
Как это должно выглядеть?
Как я понял - здесь необходимо использовать файл заголовков?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.11.2017, 16:55
Ответы с готовыми решениями:

Разделение кода на несколько файлов
Доброго времени суток. Заинтересовал вопрос о разделении кода, когда это требуется разделяю на один CPP файл и некоторое количество H...

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

Разделение кода на несколько файлов
• Имеем основной cpp файл с main. • Имеем код некоторых нужных функций • Есть указание реализовать эти функции не в основном cpp, а в...

19
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
08.11.2017, 17:05
C++
1
2
3
4
5
// dmsg1.h
 
#pragma once
 
void displayMSG1(void);
C++
1
2
3
4
5
6
7
8
9
10
11
// dmsg1.cpp
 
#include <iostream>
#include "dmsg1.h"
 
using namespace std;
 
void displayMSG1(void)
{
    cout << "Привет\n";
}
C++
1
2
3
4
5
// dmsg2.h
 
#pragma once
 
void displayMSG2(void);
C++
1
2
3
4
5
6
7
8
9
10
11
// dmsg2.cpp
 
#include <iostream>
#include "dmsg2.h"
 
using namespace std;
 
void displayMSG2(void)
{
    cout << "Как дела?\n";
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// main.cpp
 
#include <locale.h>
#include <Windows.h>
#include "dmsg1.h"
#include "dmsg2.h"
 
int main()
{
    setlocale(LC_ALL, "RUS");
 
    displayMSG1();
    displayMSG2();
    system("pause");
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
08.11.2017, 17:05
Цитата Сообщение от Nightingale81 Посмотреть сообщение
Как я понял - здесь необходимо использовать файл заголовков?
желательно, но совершенно не обязательно. Достаточно раскидать функции по раным ЦПП файлам, добавленным/созданным в проекте.
0
3 / 3 / 2
Регистрация: 21.01.2017
Сообщений: 24
08.11.2017, 17:07
Вариантов огромное множество.
1)Просто помести вторую функцию в отдельный файл, а в основном напиши include "название файла"
2)Использовать прототип. Помещаешь функцию в отдельный файл, копируешь ее заголовок и вставляешь в основной
C++
1
2
3
4
5
6
7
8
9
void displayMSG1(void);
int main()
{
    setlocale(LC_ALL, "RUS");
 
    displayMSG1();
    displayMSG2();
    system("pause");
}
2.1) Или же создаешь .h файл и в него помещаешь прототип, а потом в главном файле подключаешь .h через include
0
-10 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 243
08.11.2017, 17:28  [ТС]
Спасибо.
Попробовал 1 вариант (Без .h). Создал файл "function1.cpp.
В него вписал
C++
1
2
3
4
5
6
#include <iostream>
using namespace std;
void displayMSG2(void)
{
    cout << "Как дела?\n";
}
В файле main.cpp добавил строку:
C++
1
#include "function1.cpp"
Результат - ошибка LNK2005 "void __cdecl displayMSG2(void)" (?displayMSG2@@YAXXZ) уже определен в function1.obj
и LNK1169 обнаружен многократно определенный символ - один или более
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
08.11.2017, 17:36
Можно перенести заголовки функций из заголовочных файлов в main.cpp и убрать везде include, но этот способ не совсем корректен. Учитесь делать правильно, с заголовочными файлами. Это способствует хорошему стилю объектно-ориентированного программирования, повторному использованию кода в других программах добавлением одной строчки include.
0
-10 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 243
08.11.2017, 17:43  [ТС]
Получился только вариант с использованием ".h" (((

Надо и .h файле писать
C++
1
void displayMSG2(void);
И в .cpp файле писать
C++
1
 void displayMSG2(void)
Странно это как то всё...
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
08.11.2017, 17:43
Nightingale81, а кто тебя надоумил вообще добавлять это твоё инклюде? Ты ответы-то на форуме глазами, наконец перечитай! В частности, QuakerRUS. Где он тебе писал вставлять твой файл в инклюд?
Удали нафиг, все свои инклюды! Никто так не объединяет файлы!
0
-10 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 243
08.11.2017, 17:47  [ТС]
1)Просто помести вторую функцию в отдельный файл, а в основном напиши include "название файла"

Это не я придумал
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
08.11.2017, 17:48
Цитата Сообщение от Nightingale81 Посмотреть сообщение
Странно это как то всё...
вот я сейчас смотрю в шоке на строчки типа #include "function1.cpp" и это действительно странно. То есть человек же должен следовать какой-то логике, а не рандомный набор букв после #include писать. Или из какой-то книги это вычитал... вряд ли.

Просто чем нужно думать, чтобы вместо простого вызова функции из другого файла типа
C++
1
2
3
4
void displayMSG1(void);
int main(){
    displayMSG1();
}
...вместо простого вызова функции, пытаться каким-то макаром ВСТАВИТЬ ТЕКСТ ЭТОЙ ФУНКЦИИ] в программу. Зачем?????
0
 Аватар для RoyAnria
0 / 0 / 0
Регистрация: 02.11.2017
Сообщений: 13
08.11.2017, 17:51
Всегда используйте инклюд гварды, дабы предотвратить возможное повторное подключение заголовков, которое приводит к данной ошибке.
Пример на вашем коде (как правильно разбить на файлы), попробуйте скомпилировать:

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "func1.h"
#include "func2.h"
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "RUS");
 
    displayMSG1();
    displayMSG2();
    system("pause");
}
func1.h
C++
1
2
3
4
#pragma once
#include <iostream>
 
void displayMSG1(void);
func2.h
C++
1
2
3
4
#pragma once
#include <iostream>
 
void displayMSG2(void);
func1.cpp
C++
1
2
3
4
5
6
#include "func1.h"
 
void displayMSG1(void)
{
    std::cout << "Привет\n";
}
func2.cpp
C++
1
2
3
4
5
6
#include "func2.h"
 
void displayMSG2(void)
{
    std::cout << "Как дела?\n";
}

Обратите внимание на директиву #pragma once в начале каждого заголовочного файла, это и есть инклюд гвард (работает в Visual Studio, т.к. это его родная директива, в других средах не проверял), но лучше использовать инклюд гвард вот такого вида (работает везде):

#ifndef _FUNC1_H_
#define _FUNC1_H_

...ВАШ КОД...

#endif

пример:
func1.h
C++
1
2
3
4
5
6
7
#ifndef _FUNC1_H_
#define _FUCN1_H_
#include <iostream>
 
void displayMSG1(void);
 
#endif
Также обратите внимание на объявление переменных в *.h файлах (заголовочных), т.к. иногда это может привести вас к подобной ошибке.
К примеру, вам нужна переменная в func1.cpp, которую вы потом выведете с помощью ф-ции displayMSG1.
Тогда в заголовочном файле func1.h нужно объявить эту переменную в таком виде:
extern int i;
а уже в cpp файле прописать int i=0 , или же int i(0).
Если есть еще вопросы, или непонятно что -- спрашивайте, отпишусь =) Удачи!
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
08.11.2017, 18:01
для наглядности:
представьте что в Вашей многокомнатной квартире в какой-то комнате (*.cpp) есть телевизор со своими кнопками
C++
1
2
3
4
int func(int x)
{
    return (x*11);
}
воспользоваться им можно с помощью его кнопок из этой комнаты(тут есть нюанс, но пока не суть), однако из других комнат им можно воспользоваться только через пульт
C++
1
int func(int x);
Двух одинаковых телевизоров быть не должно, но пультов может быть сколько угодно.

то есть для вызова из, скажем, main.cpp функции, описаной в notmain.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//notmain.cpp:
//телевизор
int func(int x)
{
    return (x*11);
}
 
//main.cpp:
//пульт
int func(int x);
 
int main(void)
{
    func(33);
    return(0);
}
а теперь представьте, что для удобства у Вас есть коробки с пультами от разных вещей (*.h) :

C++
1
2
3
4
//myfunctions.h:
 
int func(int x);
int anotherFunc(int a, int b);
которые можно расставить по разным комнатам:
C++
1
2
3
4
5
6
7
8
9
//main.cpp:
#include "myFunctions.h"
 
int main(void)
{
    func(33);
    anotherFunc(34, 22);
    return(0);
}
В принципе, для простого понимания, #include "something.h" подменяется на то что в этом something.h написано (тут тоже есть нюансы аля #pragma once или #ifndef _SDAS_H_ #define _SDAS_H_ //***// #endif, об этом стоит отдельно почитать
0
 Аватар для RoyAnria
0 / 0 / 0
Регистрация: 02.11.2017
Сообщений: 13
08.11.2017, 18:07
И еще, вот вам хороший видео-курс по С++, сам на нем учиться начинал. Автор также поднимает проблемы, часто возникающие на практике, потому смотреть от начала и до конца, а так же обязательно делать ДЗ. По окончанию курса, подобных ошибок точно делать не будете.
Уроки С++ для начинающих (Марков Денис)
0
-10 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 243
08.11.2017, 18:21  [ТС]
Спасибо!!

С начала попытался сделать то, что предложили мне это:
1)Просто помести вторую функцию в отдельный файл, а в основном напиши include "название файла"

Потом сделал то, что предложил QuakerRUS
И всё получилось. Спасибо!

Только я не понял, зачем надо было делать несколько файлов заголовков, когда можно было сделать один и объявить в нём одном несколько функций ???

Добавлено через 15 секунд
Спасибо!!

С начала попытался сделать то, что предложили мне это:
1)Просто помести вторую функцию в отдельный файл, а в основном напиши include "название файла"

Потом сделал то, что предложил QuakerRUS
И всё получилось. Спасибо!

Только я не понял, зачем надо было делать несколько файлов заголовков, когда можно было сделать один и объявить в нём одном несколько функций ???
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
08.11.2017, 18:31
Обычно один заголовочный файл определяет заголовки одного исходного файла (*.cpp), нет смысла в один заголовочный файл записывать заголовки с двух разных исходных файлов, проще тогда сделать один заголовочный и один исходный файл. Но так как по условию нужны два cpp файла, то и делается обычно два h файла.

Что касается классов, то обычно каждый отдельный класс помещается в отдельный cpp файл, а описание класса в h файле.

При компиляции проекта заново компилироваться будут только измененные cpp модули, что ускоряет процесс компиляции проекта. Так же вы с легкостью сможете в другой проект переносить модули копированием cpp и h файла и добавлением include в main.cpp
0
-10 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 243
09.11.2017, 14:12  [ТС]
Сейчас читаю книжку "C++ для Чайников" )) .
Правда из того, что там написано, не так уж и просто, как предполагалось.
Но, наверное, это одна из лучших книг для начинающих...
0
 Аватар для RoyAnria
0 / 0 / 0
Регистрация: 02.11.2017
Сообщений: 13
10.11.2017, 01:31
С разбиением на части разобрались?
Говорю же, пройдите данный видео-курс Ссылка на ютуб , как новенькому, вам будет намного проще понять основы С++ с помощью этого курса (именно на такую аудиторию он и направлен). А потом за книги беритесь, библиотеки учите (STL, Boost, SFML... что душа желает, или же работодатель )
0
-10 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 243
10.11.2017, 12:46  [ТС]
RoyAnria

А чем хуже эти видеоуроки?

https://www.youtube.com/playli... pJQYSPGO9r

Добавлено через 15 секунд
RoyAnria

А чем хуже эти видеоуроки?

https://www.youtube.com/playli... pJQYSPGO9r
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
10.11.2017, 14:54
Nightingale81, тем что ты их наизусть уже выучил и тем не менее не можешь разбить код на файлы?
0
-10 / 0 / 0
Регистрация: 09.06.2016
Сообщений: 243
10.11.2017, 15:48  [ТС]
Kuzia domovenok

А можно тебя (конкретно ТЕБЯ!!)) попросить, что бы ты больше НИКОГДА!!!! не писал в моих темах???????
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2017, 15:48
Помогаю со студенческими работами здесь

Разделение кода в Visual Studio на несколько файлов
Можно ли как то разделить код на несколько файлов? Например в основном файле у меня будет код отвечающий за вывод сообщения в консоль. ...

Разделение кода на несколько файлов
Здравствуйте!:senor: Помогите, пожалуйста, решить проблему. Она не столь тяжелая, но у меня не выходит. &lt;!-- Пример...

Разделение С кода на несколько файлов
Нужно разделить исходный код на 5 частей. #include &lt;stdio.h&gt; #define MAXVAL 100 int sp=0; char val; void push(char...

Разделение кода на несколько файлов
Добрый день. Нужна помощь.В задании сказано, что нужно ввести данные с клавиатуры. Проблема в том, что функция написана, но в основной...

Разделение программы на несколько файлов
Всем доброго времени суток! Возникла проблема - я написал небольшую програмку в main. #include &lt;stdio.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru