Как соединить два cpp файла

Обновлено: 06.07.2024

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

Объединить два файла в C++

Чтобы объединить два файла в программировании на C++ , вы должны попросить пользователя ввести имя трех файлов с расширением.

Теперь сначала откройте два файла и начните копировать содержимое первого файла в третий файл (целевой файл), после этого начните добавлять содержимое второго файла в третий файл (целевой файл), как показано здесь в следующей программе.

Программный код C++ для объединения двух файлов

Следующие программы на C++ объединяют два файла и сохраняют содержимое обоих файлов в другом файле.

Поэтому следующая программа на C++ просит пользователя ввести три имени файла. Первое имя файла и второе имя файла (скажем, file1.txt и file2.txt ), затем Третье имя файла, которое используется для хранения содержимого двух файлов (скажем, filet.txt ).

Таким образом, следующая программа C++ объединяет два файла и записывает их в третий файл:

Когда вышеупомянутая программа C ++ компилируется и выполняется, она даст следующий результат:

obiedinit-dva-faila-с++kompilyator

Объединить два файла C

Чтобы объединить два файла в программировании на C, сначала откройте два файла и начните копировать содержимое первого файла в третий файл (целевой файл), после этого начните добавлять содержимое второго файла в третий файл (целевой файл)

Код программирования C для объединения двух файлов

После C программа объединяет два файла и сохраняет содержимое обоих файлов в другой файл. Поэтому следующая C-программа попросит пользователя ввести три имени файла. Первое имя файла и второе имя файла (скажем, file1.txt и file2.txt ), затем третье имя файла, которое используется для хранения содержимого двух файлов (например, filet.txt ). Таким образом, следующая программа на C объединяет два файла и записывает их в третий файл:

obiedinit-dva-faila-ns-c

Когда вышеупомянутая программа c скомпилирована и выполнена, она выдаст следующий результат:

Объединить два файла

Чтобы объединить два файла в Java-программировании, вы должны попросить пользователя ввести имя обоих файлов с расширением, чтобы объединить его содержимое и сохранить объединенное содержимое в третьем файле, поэтому также попросите пользователя ввести третье имя файла. с расширением для выполнения этого действия, как показано в следующей программе.

Программный код Java для объединения двух файлов

После Java-программы попросите пользователя ввести первое и второе имя файла с расширением для объединения его содержимого, а затем попросите пользователя ввести третье имя файла с расширением для хранения объединенного содержимого внутри него:

Когда вышеуказанная Java-программа компилируется и выполняется, она выдаст следующий вывод:

obiedinit-dva-faila-java

Объединить два файла в Python

Чтобы объединить два файла в python, вы должны попросить пользователя ввести имя первого и второго файла, а затем попросить имя файла, чтобы создать файл, чтобы поместить объединенное содержимое двух файлов в этот вновь созданный файл.

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

Программный код Python для объединения двух файлов

Следующая программа python просит пользователя ввести первое и второе имя файла, затем создать файл для ввода или размещения объединенного содержимого первого и второго файла в этот файл, как показано здесь в этой программе:

Предположим, у нас есть два файла в текущем каталоге, а именно code.txt и cracker.txt . Файл codes.txt содержит следующее содержимое:

И файл cracker.txt содержит следующее содержимое:

Теперь давайте объединим оба файла в другой новый файл с именем codescracker.txt, как показано в следующих примерах :

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

obiedinit-dva-faila-python

Теперь поставить первое имя файла скажем codes.txt и нажмите клавишу ввода, а затем поставить второе имя файла сказать cracker.txt и нажмите клавишу ввода, а теперь поставить или введите имя файла , чтобы объединить содержимое этих двух файлов в нем говорят codescracker. TXT и нажмите клавишу ввода, чтобы, наконец, выполнить операцию слияния, как показано в данном примере выполнения здесь:

obiedinit-dva-faila-python-1

obiedinit-dva-faila-vivod-python

Теперь введите y и нажмите клавишу ввода, чтобы увидеть объединенное содержимое, присутствующее в файле codescracker.txt, как показано здесь:

Как только программы становятся больше, их следует разбивать на несколько файлов (в целях удобства и улучшения функциональности). Одним из преимуществ использования IDE является легкость в работе с n-ным количеством файлов. Мы уже знаем, как создавать и компилировать однофайловые проекты, добавление новых файлов не составит труда.

Многофайловые проекты в Visual Studio

В Visual Studio щелкните правой кнопкой мыши по имени вашего проекта в "Обозревателе решений" , затем "Добавить" > "Создать элемент. " :


Во всплывающем диалоговом окне выберите тип файла, укажите его имя, расположение, а затем нажмите "Добавить" :


Также вы можете добавлять файлы к вашему проекту через "Проект" > "Добавить новый элемент. " :



Многофайловые проекты в Code::Blocks

В Code::Blocks перейдите в "File" > "New" > "File. " :


Затем выберите "C/C++ source" и нажмите "Go" :


Затем "Next" (этого окна может и не быть):


Затем "C++" и опять "Next" :


Затем укажите имя нового файла (не забудьте расширение .cpp) и его расположение (нажмите на троеточие и выберите путь). Убедитесь, что поставлены все три галочки (они отвечают за конфигурации сборки). Затем нажмите "Finish" :


Готово! Файл добавлен.

Многофайловые проекты в GCC/G++

В командной строке вам нужно будет создать файл, указать его имя и подключить к компиляции, например:

g++ main.cpp add.cpp -o main

Пример многофайловой программы

Рассмотрим следующую программу, которая состоит из двух файлов.

std :: cout << "The sum of 3 and 4 is: " << add ( 3 , 4 ) << std :: endl ;

Попробуйте запустить эту программу. Она не скомпилируется, вы получите следующую ошибку:

add: идентификатор не найден

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

Тем не менее, в данном случае, мы хотим, чтобы main.cpp знал (и использовал) функцию аdd(), которая находится в add.cpp. Для предоставления доступа main.cpp к функциям add.cpp, нам нужно использовать предварительное объявление:

int add ( int x , int y ) ; // это нужно для того, чтобы main.cpp знал, что функция add() определена в другом месте std :: cout << "The sum of 3 and 4 is: " << add ( 3 , 4 ) << std :: endl ;

Теперь, когда компилятор будет компилировать main.cpp, он будет знать, что такое add(). Попробуйте запустить эту программу еще раз.

Что-то пошло не так!

Пункт №1: Если вы получили ошибку от компилятора, что функция add() не определена в main(), то, скорее всего, вы забыли записать предварительное объявление функции add() в main.cpp.

Пункт №2: Если вы получили следующую ошибку от линкера:

unresolved external symbol "int __cdecl add(int,int)" (?add@@YAHHH@Z) referenced in function _main

то возможных решений есть несколько:

a) Cкорее всего, add.cpp некорректно добавлен в ваш проект. Если вы используете Visual Studio или Code::Blocks, то вы должны увидеть add.cpp в "Обозревателе решений" в списке файлов вашего проекта или в панели проекта IDE. Если добавленного файла нет, то щелкните правой кнопкой мыши по вашему проекту и добавьте файл, как это показано выше, а затем повторите попытку компиляции вашего проекта.

б) Вполне возможно, что вы добавили add.cpp к другому проекту.

в) Вполне возможно, что добавленный файл не подключен к компиляции/линкингу. Щелкните правой кнопкой мыши по имени вашего добавленного файла и выберите "Свойства" :


Убедитесь, что пункт "Исключен из сборки" оставлен пустым или выбрано значение "Нет" :


Пункт №3: Не следует писать следующую строку в main.cpp:

Наличие этой строки приведет к тому, что компилятор вставит всё содержимое add.cpp непосредственно в main.cpp вместо того, чтобы рассматривать эти файлы как отдельные.

Разделите следующую программу на два файла (main.cpp и input.cpp): main.cpp должен содержать функцию main(), а input.cpp — функцию getInteger().

Помните, что для функции getInteger() вам понадобится предварительное объявление в main.cpp.

Ответ

int getInteger ( ) ; // предварительное объявление функции getInteger() (905 оценок, среднее: 4,87 из 5)

Урок №19. Прототип функции и Предварительное объявление

Комментариев: 50

Я так понимаю, что при включении в главный файл заголовочный файл библиотеки, которые были в заголовочном файле копируются, что только прибавляет веса главному файлу или все же копирует лишь функции?

Здравствуйте. А если у меня функция getInteger() будет определена в 2 и более файлах, то как файл с функцией main() поймет какой именно getInteger() мне требуется?

Я методом тыка уже определил что будет ошибка )

Юрий :

Если вы подключите больше одного файла с определением одной и той же функции в проект, то получите ошибку компиляции. Функция определяется 1 раз в 1 файле.

Юрий :

Смотрите решение в уроке №7.

Спасибо, Юрий! Замечательные уроки! Получаю удовольствие.. Возникают вопросы.. ищу на сайтах.. нахожу.. Будут посерьёзнее, намерен обращаться, если позволите!

Юрий :

Начал изучать С++ для создания игр на Unreal, но там все как то сложно.
Случайно наткнулся на ваши уроки, это же просто чудо какое то)
Спасибо за ваш труд.
Пожалуй накидаю плюсиков в карму автору)

Мне кажется стоило также указать что хорошим тоном является написать функцию в <name>.cpp, сделать её объявление в <name>.h, после чего подключить <name.h> в основном файле.

Вместо того чтобы писать объявления функций напрямую.

Первый файл с функцией int getInteger():

Может кто-нибудь знает как это все осуществить при помощи Xcode, или статью какую-нибудь по обучению использования этой среды.

А что сложного в Xcode? Всё по аналогии с VS, но со своими особенностями (если уж на то пошло). Можно нагуглить на крайний случай.

Юрий :

Здравствуйте я пишу в андроид с помощью Dcoder и хотел пройти тест в конце этого урока но у меня выдаёт ошибку.

Спасибо за уроки, хороший язык оказывается.

Срочно нужна помощь.
Начал программировать на андроид с приложения Dcoder(c++: GCC compiler 6.3 (знаю, что это неудобно и т. д., но лучше так, чем никак).
С этим уроком получилась зиминка из-за моего не состояния найти способ, как связать несколько файлов именно в этом приложении. Если кто-то что с этим делать, тогда пишите (буду очень благодарен). Автору спасибо за уроки. Всё очень доходчиво написано.

Это символ переноса строки, такая управляющая последовательность(и гуглите 🙂 )

Какая же чудесная находка для меня эти уроки) Автору огромное спасибо за проделанную работу за перевод и адаптацию

Юрий : Юрий :

Здравствуйте. Как добавлять файлы в Visual Studio 2017 если он на русском. Просто не очень понятно, переводчик не помогает.

Юрий :

Тогда я ошибся, и это чудесно =) Прошу прощения. Я не заметил ссылки, привык их искать где-то в аннотации.

Юрий :

Ничего, без проблем 🙂

Добрый день! При попытке добавить в функцию, которая находится в отдельном файле, "stdafx.h" компилятор выдаёт ошибку: не удаётся открыть файл включения stdafx.h: No such file or directory. Без stdafx.h всё нормально работает. Visual Studio 2015.

Юрий :

Сегодня читала статью с телефона. Очень удобный сайт)

Юрий :

Когда пишу файл add.cpp постоянно не идёт,это ж линкер мешает по моему. И что ему не так,когда твою программу скопировал,также всё:

Ошибка LNK2019 ссылка на неразрешенный внешний символ _main в функции "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) add.cpp 1

Юрий :

Вы сделали всё как в уроке? Правильно добавили файл? К тому проекту, что нужно?

Почему в VS нужно обязательно подключать библиотеку stdafx.h? Раньше, когда я учился по видеоурокам, я писал программы и без ее подключения. Но конечно есть одно но, я тогда немного изменил параметры создания проекта: поставил галочку на "Empty project" и удалил галочку на "Security Development Lifecycle (SDL) checks ". Может быть это как-то повлияло?

Юрий :

Зачем писать названия в VS (например Source Files) на английском, если в VS есть русский язык?

В статье вы научитесь создавать программу из нескольких файлов

Содержание

Объявления и определения

Рассмотрим задачу: надо вывести числа от N до 1, при этом для нечётных чисел надо писать odd $ , а для чётных even $ . Вывод должен выглядеть так:

Ради интереса решим задачу с помощью рекурсии:

Увы программа не компилируется. В C++ каждая функция должна быть объявлена или определена до первого использования, но в нашем случае printEvenRecursive использует printOddRecursive, а printOddRecursive использует printEvenRecursive! Мы не можем поместить определение одной функции выше другой так, чтобы каждая функция была объявлена перед использованием.

Но кроме определений функций в C++ есть объявления функций

  • Объявление (declaration) - это конструкция, которая зарезервирует идентификатор и опишет для компилятора его тип, но не раскроет деталей работы объявленной сущности.
  • Определение (definition) - это конструкция, которая не только зарезервирует идентификатор, но и раскроет реализацию связанной с ним сущности

Объявление функции похоже на определение функции, только вместо тела стоит точка с запятой:

Теперь мы можем переписать рекурсивный пример, просто разместив определения обеих функций в начале файла.

Хорошим стилем считается заранее и в одном месте писать объявления всех функций, кроме main. Вы можете писать объявления в начале cpp-файла или в заголовке. О заголовках читайте ниже.

Пишем свой заголовок

  • Заголовок может иметь и другое расширение файла, но не стоит нарушать джентльменских соглашений: используйте h или hpp
  • В заголовке пишут только объявления функций, а все определения можно и нужно помещать в cpp-файл

Создайте каталог, и разместите в нём файл print.h , в котором будут объявления функций. Скопируйте туда код, приведённый ниже.

Мы могли бы убрать из заголовка printEvenRecursive и printOddRecursive, сделав его чище, но сейчас для примера оставим.

Запомните правила хорошего тона:

Теперь создайте файл print.cpp , в котором будут реализованы функции из заголовка print.h . Скопируйте туда код, расположенный ниже.

В конце создайте файл main.cpp и скопируйте в него код:

Компоновка программы из нескольких файлов

Собирая программу из одного файла с помощью g++, вы на деле выполняли одним махом два действия:

  • компиляцию, в ходе которой исходный текст файла превращается в логическую модель (AST) и затем превращается в объектный код, в котором машинные коды смешаны со ссылками на внешние функции
  • компоновку, в ходе все внешние ссылки на функции заменяются на машинный код либо превращаются в ссылки на динамические библиотеки (dll/so, также известны как shared libraries)

Сейчас эти же действия мы выполним раздельно. Отройте терминал и введите последовательно две команды:

Если код в обоих cpp-файлах синтаксически правилен, то компилятор создаст два файла: main.o и print.o . Эти файлы называют объектными файлами (object files). Именно они содержат машинный код, смешанный со ссылками на внешние функции.

Вы можете дизассемблировать эти файлы, чтобы посмотреть, во что компилятор превратил ваш код. Для этого выполните команду objdump -d main.o .

Теперь мы вызовем g++ для компоновки объектных файлов. На выходе мы получим исполняемый файл print_executable.exe

На деле компилятор не будет компоновать: он передаст эту задачу утилите ld. Вызывать утилиту ld вручную мы не станем, потому что потребуются дополнительные флаги, которые включают компоновку со стандартной библиотекой C++.

Компоновка программы в CMake

CMake прячет факт раздельной компиляции файлов. Чтобы в CMake скомпоновать программу, состоящую из нескольких частей, просто перечислите эти файлы в add_executable.

Удалите файл print_recursive.exe :

Создайте файл CMakeFiles.txt с одной строкой:

Теперь выполните конфигурирование и сборку программы:

Мы почти закончили! Остался только один вопрос: почему в add_executable мы указали заголовок print.h , если он всё равно не компилируется сам по себе? Дело в том, что при любых изменениях в коде заголовка print.h вся программа должна быть пересобрана, но файл print.h сам по себе не компилируется. Добавление print.h в список исходников в CMake позволяет CMake следить за датой и временем модификации заголовка, чтобы решить, надо ли повторно собирать проект из-за изменений в заголовках.

По мере того, как программы становятся больше, в целях организации или повторного использования их обычно разделяют на несколько файлов. Одним из преимуществ работы с IDE является то, что они значительно упрощают работу с несколькими файлами. Вы уже знаете, как создавать и компилировать однофайловые проекты. Добавить новые файлы в существующие проекты очень просто.

Лучшая практика

Когда вы добавляете в проект новые файлы исходного кода, давайте им расширение .cpp .

Для пользователей Visual Studio

В Visual Studio кликните правой кнопкой мыши на папке Исходные файлы (Source Files) в окне Обозревателя решений (Solution Explorer) и выберите Добавить (Add) → Создать элемент… (New Item…).

Рисунок 1 Добавление нового файла в проект в Visual Studio

Рисунок 1 – Добавление нового файла в проект в Visual Studio

Убедитесь, что у вас выбран Файл C++ (.cpp). Дайте новому файлу имя, и он будет добавлен в ваш проект.

Рисунок 2 Создание нового файла в проекте в Visual Studio

Рисунок 2 – Создание нового файла в проекте в Visual Studio

Примечание. Если вы создаете новый файл из меню Файл (File), а не из своего проекта в обозревателе решений, новый файл не будет добавлен в ваш проект автоматически. Вам придется добавить его в проект вручную. Для этого кликните правой кнопкой мыши на папке Исходные файлы (Source Files) в окне Обозревателя решений (Solution Explorer) и выберите Добавить (Add) → Существующий элемент (Existing Item), а затем выберите свой файл.

Теперь, когда вы компилируете свою программу, вы должны увидеть, как компилятор перечисляет имя вашего файла при компиляции.

Для пользователей Code::Blocks

В Code::Blocks перейдите в меню File (Файл) и выберите New (Создать) → File… (Файл…).

Рисунок 3 Создание нового файла в Code::Blocks

Рисунок 3 – Создание нового файла в Code::Blocks

В диалоговом окне New from template (Создать из шаблона) выберите C/C++ source (Исходный файл C/C++) и нажмите Go (Перейти).

Рисунок 4 Создание нового исходного файла C/C++ в Code::Blocks

Рисунок 4 – Создание нового исходного файла C/C++ в Code::Blocks

На этом этапе вы можете увидеть или не увидеть приветствие в диалоговом окне мастера создания исходного файла C/C++. Если да, щелкните Next (Далее).

Рисунок 5 Диалоговое окно мастера создания исходного файла C/C++

Рисунок 5 – Диалоговое окно мастера создания исходного файла C/C++

На следующей странице мастера выберите C++ и нажмите Next (Далее).

Рисунок 6 Выбор языка при создании нового исходного файла в Code::Blocks

Рисунок 6 – Выбор языка при создании нового исходного файла в Code::Blocks

Теперь дайте новому файлу имя (не забудьте расширение .cpp ) и выберите все конфигурации сборки. Наконец, выберите Finish (Готово).

Рисунок 7 Указание имени файла и выбор конфигураций сборки

Рисунок 7 – Указание имени файла и выбор конфигураций сборки

Теперь, когда вы будете компилировать свою программу, вы должны увидеть, как компилятор перечисляет имя вашего файла по мере компиляции.

Для пользователей GCC/G++

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

где main.cpp и add.cpp – это имена ваших исходных файлов, а main – имя выходного файла.

Пример с несколькими файлами

В уроке «2.6 – Предварительные объявления и определения» мы рассмотрели программу с одним исходным файлом, которая не компилируется:

Когда компилятор достигает вызова функции add в строке 5 в функции main , он не знает, что такое add , потому что мы определили add только в строке 9! Нашим решением было либо переупорядочить функции (поместив сначала add ), либо использовать для add предварительное объявление.

Теперь посмотрим на аналогичную программу из нескольких исходных файлов:

Ваш компилятор может решить сначала скомпилировать либо add.cpp , либо main.cpp . В любом случае main.cpp не скомпилируется, что приведет к той же ошибке компилятора, что и в предыдущем примере:

Причина точно такая же: когда компилятор достигает строки 5 файла main.cpp , он не знает, что такое идентификатор add .

Помните, что компилятор компилирует каждый файл отдельно. Он не знает о содержимом других исходных файлов и не запоминает что-либо, что он видел из ранее скомпилированных исходных файлов. Таким образом, даже если компилятор, возможно, видел определение функции add ранее (если он сначала скомпилировал add.cpp ), он этого не запомнил.

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

Наши варианты решения здесь такие же, как и раньше: поместить определение функции add перед функцией main или удовлетворить компилятор предварительным объявлением. В этом случае, поскольку функция add находится в другом файле, вариант изменения порядка определений не подходит.

Лучшее решение здесь – использовать предварительное объявление:

main.cpp (с предварительным объявлением):

add.cpp (остается прежним):

Теперь, когда компилятор компилирует main.cpp , он будет знать, что такое идентификатор add , и будет удовлетворен. Линкер соединит вызов функции add в main.cpp с определением функции add в add.cpp .

Используя этот метод, мы можем предоставить файлам доступ к функциям, которые находятся в другом файле.

Попробуйте скомпилировать add.cpp и main.cpp с предварительным объявлением. Если вы получили ошибку линкера, убедитесь, что вы правильно добавили add.cpp в свой проект или строку компиляции.

Что-то пошло не так!

Есть много вещей, которые могут пойти не так, когда вы в первый раз попытаетесь работать с несколькими файлами. Если вы попробовали приведенный выше пример и столкнулись с ошибкой, проверьте следующее:

1. Если вы получаете ошибку компилятора о том, что add не определена в main , вы, вероятно, забыли предварительное объявление для функции add в main.cpp .

2а. … наиболее вероятная причина в том, что add.cpp неправильно добавлен в ваш проект. При компиляции вы должны увидеть в списке компиляции и main.cpp , и add.cpp . Если вы видите только main.cpp , значит add.cpp определенно не компилируется. Если вы используете Visual Studio или Code::Blocks, вы должны увидеть add.cpp в списке в обозревателе решений / на панели проекта в левой части IDE. Если его не видно, кликните на проекте правой кнопкой мыши и добавьте этот файл, а затем попробуйте скомпилировать снова. Если вы компилируете из командной строки, не забудьте включить main.cpp и add.cpp в свою команду компиляции.

2b. … возможно, вы добавили add.cpp не в тот проект.

2c. … возможно, что файл не компилируется или не линкуется. Проверьте свойства файла и убедитесь, что файл настроен для компиляции/линковки. В Code::Blocks компиляция и линковка – это отдельные флажки, которые следует установить. В Visual Studio есть параметр «исключить из сборки» (exclude from build), для которого следует установить значение «нет» или оставить пустым.

Резюме

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

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

Напоминание: всякий раз, когда вы создаете новый исходный файл (.cpp), вам нужно будет добавить его в свой проект, чтобы он компилировался.

Читайте также: