Как подключить файл cpp c

Обновлено: 02.07.2024

Вы можете использовать Visual Studio для создания стандартных программ C++. Следуя инструкциям в этом пошаговом руководстве, вы можете создать проект, добавить в проект новый файл, изменить файл, добавив код C++, а затем скомпилировать и запустить программу с помощью Visual Studio.

Вы можете написать свою собственную программу на C++ или использовать один из примеров программ. Образец программы в этом пошаговом руководстве представляет собой консольное приложение. Это приложение использует контейнер set из стандартной библиотеки C++.

Если требуется соответствие определенной версии стандарта языка C++ (например, C++14, C++17 или C++20), используйте /std:c++14 , /std: c++17 или параметр компилятора /std:c++20. (Visual Studio 2017 и более поздние версии.)

Предпосылки

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

Чтобы создать проект и добавить исходный файл

Следующие шаги различаются в зависимости от используемой версии Visual Studio. Чтобы просмотреть документацию для предпочитаемой версии Visual Studio, используйте элемент управления выбора версии. Он находится в верхней части оглавления на этой странице.

Создание проекта C++ в Visual Studio

В главном меню выберите «Файл» > «Создать» > «Проект», чтобы открыть диалоговое окно «Создать новый проект».

В верхней части диалогового окна установите для параметра "Язык" значение C++, для параметра "Платформа" выберите значение "Windows" и для параметра "Тип проекта" выберите значение "Консоль".

В отфильтрованном списке типов проектов выберите «Консольное приложение», затем нажмите «Далее». На следующей странице введите имя проекта и при необходимости укажите местоположение проекта.

Нажмите кнопку «Создать», чтобы создать проект.

Создание проекта C++ в Visual Studio 2017

Создайте проект, выбрав пункт «Создать» в меню «Файл» и выбрав «Проект».

На панели типов проектов Visual C++ щелкните Рабочий стол Windows, а затем щелкните Консольное приложение Windows.

Введите имя проекта. По умолчанию решение, содержащее проект, имеет то же имя, что и проект, но вы можете ввести другое имя. Вы также можете указать другое место для проекта.

Нажмите "ОК", чтобы создать проект.

Создание проекта C++ в Visual Studio 2015

Создайте проект, выбрав пункт «Создать» в меню «Файл» и выбрав «Проект».

На панели типов проектов Visual C++ щелкните Рабочий стол Windows, а затем щелкните Консольное приложение Windows.

В диалоговом окне "Новый проект" разверните "Установлено" > "Шаблоны" > Visual C++ и выберите Win32. На центральной панели выберите Консольное приложение Win32.

Введите имя проекта. По умолчанию решение, содержащее проект, имеет то же имя, что и проект, но вы можете ввести другое имя. Вы также можете указать другое место для проекта.

Нажмите "ОК", чтобы создать проект.

Завершите работу мастера приложений Win32.

Нажмите "Далее", затем убедитесь, что выбрано консольное приложение, и снимите флажок "Предварительно скомпилированные заголовки".

Нажмите "Готово".

Добавить новый исходный файл

Если обозреватель решений не отображается, в меню "Вид" выберите "Обозреватель решений".

Добавьте в проект новый исходный файл следующим образом.

В обозревателе решений щелкните правой кнопкой мыши папку "Исходные файлы", выберите "Добавить" и выберите "Новый элемент".

В узле "Код" нажмите "Файл C++ (.cpp)", введите имя файла и нажмите "Добавить".

Файл .cpp появляется в папке "Исходные файлы" в обозревателе решений и открывается в редакторе Visual Studio.

В файле в редакторе введите допустимую программу C++, использующую стандартную библиотеку C++, или скопируйте один из примеров программ и вставьте его в файл.

В меню "Сборка" нажмите "Создать решение".

В окне вывода отображается информация о ходе компиляции, например, расположение журнала сборки и сообщение, указывающее на статус сборки.

В меню "Отладка" выберите "Запустить без отладки".

Если вы использовали пример программы, отобразится командное окно и показано, найдены ли определенные целые числа в наборе.

В проекте C++ включение файлов .h исходных файлов C вызовет много ошибок из-за различий в стандартах между C и C++.
Как использовать исходные файлы C в проекте C++ (или в main.cpp)?

Скомпилируйте исходный код C с помощью компилятора C; скомпилируйте исходный код C++ с помощью компилятора C++; (желательно написать функцию main() на C++); связать программу с компилятором C++.

Несовместимости очень редки. Вам придется «исправить» файлы C, чтобы они были совместимы с C++, если вы хотите использовать их в компиляторе C++, или вы можете связать объектные файлы C отдельно. Единственная проблема, с которой я столкнулся лично, — это неявное преобразование C из void* в любой другой тип указателя.

На самом деле, это не должно вызвать у вас проблем, поскольку C++ распознает стандартный C. Лучше всего исправлять имена ваших библиотек в соответствии с шаблоном: становится .Но это не должно быть проблемой

@KuramaYoko В c есть много совершенно законных (даже идоматических) конструкций, которые вызовут ошибку в компиляторе C++. Даже int *i = malloc(sizeof(int) * 10); является незаконным в С++. То же самое относится и к любому коду, который использует класс в качестве имени переменной или использует динамические массивы c99 или или или.

4 ответа 4

Для максимальной надежности:

  • Скомпилируйте исходный код C с помощью компилятора C.
  • Скомпилируйте исходный код C++ с помощью компилятора C++
  • Предпочтительно написать функцию main() на C++.
  • Свяжите программу с компилятором C++.

Убедитесь, что заголовки C либо сами осведомлены о C++, либо что код C++ включает заголовки C внутри внешнего символа "C" < . >заблокировать.

Либо (Cheader.h заголовочный файл C):

или (исходный код C++):

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

Однако, если компилятор MSVC говорит, что программы, использующие MFC, должны быть написаны исключительно на C++ (MFC требует компиляции C++ (используйте суффикс .cpp), сообщается об ошибке), то вы можете у вас нет другого выбора, кроме как убедиться, что ваш код C компилируется как код C++. Это означает, что вам придется привести возвращаемые значения из malloc() и др.; вы должны беспокоиться о других местах, где вы не используете приведение для преобразования void * в какой-либо другой тип указателя; вам нужно беспокоиться о sizeof('a') == 4 в C и sizeof('a') == 1 в C++; вы должны убедиться, что каждая функция объявлена ​​до ее использования; вы должны убедиться, что ваш код C не использует какие-либо ключевые слова C++ (в частности, typename, class; иногда также inline — но полный список довольно велик).

В некоторых кругах вам придется беспокоиться об использовании возможностей C99, которых нет в C++2003 или C++2011, таких как гибкие элементы массива, назначенные инициализаторы, составные литералы, массивы переменной длины. , и так далее. Однако, если код C предназначен для MSVC, то это, вероятно, не будет проблемой; эти функции не поддерживаются компилятором MSVC C (он поддерживает только C89, но не C99).

FWIW: У меня есть скрипт для поиска ключевых слов C++. Он содержит следующий комментарий:

Поддержка C/C++ для Visual Studio Code обеспечивается расширением Microsoft C/C++, позволяющим осуществлять кроссплатформенную разработку на C и C++ в Windows, Linux и macOS.

расширение cpp

Установите расширение

  1. Откройте VS Code.
  2. Выберите значок просмотра расширений на панели действий или используйте сочетание клавиш ( ⇧⌘X (Windows, Linux Ctrl+Shift+X )).
  3. Выполните поиск по запросу "C++".
  4. Выберите "Установить".

Поиск c++ в расширениях вид

После установки расширения при открытии или создании файла *.cpp у вас будет подсветка синтаксиса (раскрашивание), интеллектуальное завершение и наведение (IntelliSense) и проверка ошибок.

Функции языка C++

Установите компилятор

C++ — это компилируемый язык. Это означает, что исходный код вашей программы должен быть переведен (скомпилирован) перед тем, как его можно будет запустить на вашем компьютере. VS Code — это, прежде всего, редактор, и он полагается на инструменты командной строки, которые выполняют большую часть рабочего процесса разработки. Расширение C/C++ не включает компилятор или отладчик C++. Вам нужно будет установить эти инструменты или использовать те, которые уже установлены на вашем компьютере.

В вашей академической или рабочей среде разработки уже могут быть компилятор и отладчик C++. Обратитесь к своим преподавателям или коллегам за инструкциями по установке рекомендуемого набора инструментов C++ (компилятор, отладчик, система проектов, линтер).

На некоторых платформах, таких как Linux или macOS, уже установлен компилятор C++. В большинстве дистрибутивов Linux установлена ​​коллекция компиляторов GNU (GCC), и пользователи macOS могут получить инструменты Clang с помощью Xcode.

Проверьте, установлен ли у вас компилятор

Убедитесь, что исполняемый файл вашего компилятора находится в пути вашей платформы (%PATH в Windows, $PATH в Linux и macOS), чтобы расширение C/C++ могло его найти. Вы можете проверить доступность своих инструментов C++, открыв встроенный терминал ( ⌃` (Windows, Linux Ctrl+` ) ) в VS Code и попытавшись напрямую запустить компилятор.

Проверка компилятора GCC g++:

Проверка Clang компилятора Clang:

Примечание. Если вы предпочитаете полную интегрированную среду разработки (IDE) со встроенной компиляцией, отладкой и шаблонами проектов (Файл > Новый проект), доступно множество вариантов, например Visual Studio Издание сообщества.

Если у вас не установлен компилятор, в приведенном ниже примере мы описываем, как установить минималистские инструменты GNU для Windows (MinGW) C++ (компилятор и отладчик). MinGW — популярный бесплатный набор инструментов для Windows. Если вы используете VS Code на другой платформе, вы можете прочитать учебные пособия по C++, в которых рассматриваются конфигурации C++ для Linux и macOS.

Пример: установка MinGW-x64

Мы установим Mingw-w64 через MSYS2, который предоставляет актуальные встроенные сборки GCC, Mingw-w64 и других полезных инструментов и библиотек C++. Вы можете загрузить последнюю версию установщика со страницы MSYS2 или использовать эту ссылку для установки.

Следуйте инструкциям по установке на веб-сайте MSYS2, чтобы установить Mingw-w64. Не забудьте запустить каждое необходимое меню «Пуск» и команду pacman, особенно шаг 7, когда вы будете устанавливать актуальный набор инструментов Mingw-w64 ( pacman -S --needed base-devel mingw-w64-x86_64-toolchain ).

Добавьте компилятор MinGW в свой путь

Добавьте путь к папке bin Mingw-w64 в переменную среды Windows PATH, выполнив следующие действия:

  1. В строке поиска Windows введите «Настройки», чтобы открыть настройки Windows.
  2. Найдите Изменить переменные среды для своей учетной записи.
  3. Выберите переменную «Путь» в своих пользовательских переменных, а затем нажмите «Изменить».
  4. Выберите «Создать» и добавьте путь к папке назначения Mingw-w64 с добавлением \mingw64\bin к системному пути. Точный путь зависит от того, какую версию Mingw-w64 вы установили и где вы ее установили. Если вы использовали указанные выше настройки для установки Mingw-w64, добавьте это в путь: C:\msys64\mingw64\bin .
  5. Нажмите OK, чтобы сохранить обновленный путь. Вам нужно будет повторно открыть все окна консоли, чтобы новое местоположение PATH стало доступным.

Проверьте установку MinGW

Чтобы убедиться, что ваши инструменты Mingw-w64 правильно установлены и доступны, откройте новую командную строку и введите:

Если вы не видите ожидаемого вывода или g++ или gdb не является распознанной командой, убедитесь, что ваша запись PATH соответствует двоичному расположению Mingw-w64, где находятся инструменты компилятора.

Привет, мир

Чтобы убедиться, что компилятор установлен и настроен правильно, мы создадим простейшую программу Hello World C++.

Создайте папку с именем «HelloWorld» и откройте VS Code в этой папке ( code . открывает VS Code в текущей папке):

Код . Команда открывает VS Code в текущей рабочей папке, которая становится вашей «рабочей областью». Примите диалоговое окно «Доверие рабочей области», выбрав «Да, я доверяю авторам, поскольку это созданная вами папка».

Теперь создайте новый файл с именем helloworld.cpp, нажав кнопку «Новый файл» в проводнике или команду «Файл» > «Новый файл».

Кнопка

helloworld.cpp file

Добавить исходный код Hello World

Теперь вставьте этот исходный код:

Теперь нажмите ⌘S (Windows, Linux Ctrl+S ), чтобы сохранить файл. Вы также можете включить автосохранение, чтобы автоматически сохранять изменения в файле, установив флажок Автосохранение в главном меню "Файл".

Создать Hello World

Теперь, когда у нас есть простая программа на C++, давайте ее создадим. Выберите команду «Терминал» > «Выполнить задачу сборки» ( ⇧⌘B (Windows, Linux Ctrl+Shift+B )) в главном меню.

Выполнить пункт меню

Появится раскрывающийся список с различными вариантами задач компилятора. Если вы используете набор инструментов GCC, такой как MinGW, вы должны выбрать C/C++: g++.exe построить активный файл.

Выберите g++.exe задача

Это скомпилирует helloworld.cpp и создаст исполняемый файл с именем helloworld.exe , который появится в проводнике.

helloworld.exe в файле Проводник

Запустить Hello World

Из командной строки или нового интегрированного терминала VS Code теперь вы можете запустить свою программу, введя ".\helloworld".

Запустите hello world в VS Интегрированный терминал

Если все настроено правильно, вы должны увидеть вывод "Hello World".

Это очень простой пример, который поможет вам начать разработку на C++ в VS Code. Следующим шагом является использование одного из перечисленных ниже руководств на вашей платформе (Windows, Linux или macOS) с предпочитаемым набором инструментов (GCC, Clang, Microsoft C++) и получение дополнительных сведений о языковых функциях расширения Microsoft C/C++, таких как IntelliSense. , навигация по коду, конфигурация сборки и отладка.

Учебники

Начните работу с C++ и VS Code с помощью руководств для вашей среды:

Документация

Дополнительную документацию по использованию расширения Microsoft C/C++ можно найти в разделе C++ на веб-сайте VS Code, где вы найдете темы по следующим темам:

C++ TOC на code.visualstudio.com

Удаленная разработка

VS Code и расширение C++ поддерживают удаленную разработку, позволяя вам работать через SSH на удаленном компьютере или виртуальной машине, внутри контейнера Docker или в подсистеме Windows для Linux (WSL).

Чтобы установить поддержку удаленной разработки:

  1. Установите пакет расширения удаленной разработки VS Code.
  2. Если удаленные исходные файлы размещены в WSL, используйте расширение Remote-WSL.
  3. Если вы подключаетесь к удаленному компьютеру с помощью SSH, используйте расширение Remote — SSH.
  4. Если удаленные исходные файлы размещены в контейнере (например, Docker), используйте расширение Remote — Containers.

Отзыв

Если у вас возникнут какие-либо проблемы или у вас есть предложения по расширению Microsoft C/C++, сообщите о проблемах и предложениях на GitHub. Если вы еще не предоставили отзыв, пройдите небольшой опрос, чтобы настроить это расширение в соответствии с вашими потребностями.

Вот некоторые ключевые моменты (хотя некоторые поставщики компиляторов могут не требовать всего этого; сверьтесь с документацией вашего поставщика компилятора):

  • Вы должны использовать свой компилятор C++ при компиляции main() (например, для статической инициализации)
  • Ваш компилятор C++ должен управлять процессом компоновки (например, чтобы он мог получить свои специальные библиотеки)
  • Возможно, ваши компиляторы C и C++ должны поставляться одним и тем же поставщиком и иметь совместимые версии (например, чтобы у них были одинаковые соглашения о вызовах)

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

Кстати, есть еще один способ справиться со всем этим: скомпилировать весь свой код (даже код в стиле C) с помощью компилятора C++. Это в значительной степени избавляет от необходимости смешивать C и C++, а также заставит вас быть более осторожным (и, возможно, — будем надеяться! — обнаруживать некоторые ошибки) в вашем коде в стиле C. Обратной стороной является то, что вам нужно будет определенным образом обновить свой код в стиле C, в основном потому, что компилятор C++ более осторожен/разборчив, чем ваш компилятор C. Дело в том, что усилия, необходимые для очистки вашего кода в стиле C, могут быть меньше усилий, необходимых для смешивания C и C++, и в качестве бонуса вы получаете очищенный код в стиле C. Очевидно, что у вас нет особого выбора, если вы не можете изменить свой код в стиле C (например, если он написан сторонним производителем).

Как вызвать функцию C из C++?

Просто объявите функцию C extern "C" (в коде C++) и вызовите ее (из кода C или C++). Например:

Определения функций могут выглядеть следующим образом:

Обратите внимание, что используются правила типа C++, а не правила C. Таким образом, вы не можете вызвать функцию, объявленную extern "C", с неправильным количеством аргументов. Например:

Как вызвать функцию C++ из C?

Просто объявите функцию C++ extern "C" (в коде C++) и вызовите ее (из кода C или C++). Например:

Теперь f() можно использовать следующим образом:

Естественно, это работает только для функций, не являющихся членами. Если вы хотите вызывать функции-члены (включая виртуальные функции) из C, вам необходимо предоставить простую оболочку. Например:

Теперь C::f() можно использовать следующим образом:

Если вы хотите вызывать перегруженные функции из C, вы должны предоставить оболочки с разными именами, которые будет использовать код C. Например:

Теперь функции f() можно использовать следующим образом:

Обратите внимание, что эти методы можно использовать для вызова библиотеки C++ из кода C, даже если вы не можете (или не хотите) изменять заголовки C++.

Как включить стандартный заголовочный файл C в мой код C++?

Часть std:: в вызове std::printf() может выглядеть необычно, если вы работаете с C, но это правильный способ написать ее на C++.

Если вы компилируете код C с помощью компилятора C++, вам не нужно настраивать все эти вызовы с printf() на std::printf() . К счастью, в этом случае код C будет использовать заголовок в старом стиле, а не в новом, а магия пространств имен позаботится обо всем остальном:

Последний комментарий: если у вас есть заголовки C, которые не входят в стандартную библиотеку, у нас есть для вас несколько иные рекомендации. Возможны два случая: либо вы не можете изменить заголовок, либо вы можете изменить заголовок.

Как включить несистемный заголовочный файл C в код C++?

Как я могу вызвать несистемную функцию C f(int,char,float) из моего кода C++?

Блок из нескольких функций C можно сгруппировать с помощью фигурных скобок:

После этого вы просто вызываете функцию, как если бы это была функция C++:

Как мне создать функцию C++ f(int,char,float), которую можно будет вызывать из моего кода C?

Компилятор C++ должен знать, что функция f(int,char,float) должна вызываться компилятором C с использованием конструкции extern "C":

Строка extern "C" сообщает компилятору, что внешняя информация, отправляемая компоновщику, должна использовать соглашения о вызовах C и изменение имени (например, с предшествующим символом подчеркивания). Поскольку перегрузка имен не поддерживается языком C, вы не можете сделать несколько перегруженных функций одновременно вызываемыми программой на языке C.

Почему компоновщик выдает ошибки для функций C/C++, вызываемых из функций C++/C?

Если вы не правильно написали свой extern "C", вы иногда будете получать ошибки компоновщика, а не ошибки компилятора. Это связано с тем, что компиляторы C++ обычно «искажают» имена функций (например, для поддержки перегрузки функций) не так, как компиляторы C.

См. два предыдущих часто задаваемых вопроса о том, как использовать extern "C" .

Как я могу передать объект класса C++ в/из функции C?

Вот пример (информацию о extern "C" см. в двух предыдущих часто задаваемых вопросах).

В отличие от вашего кода C++, ваш код C не сможет сказать, что два указателя указывают на один и тот же объект, если только указатели не являются точно одного типа. Например, в C++ легко проверить, указывает ли Derived* с именем dp на тот же объект, на который указывает Base* с именем bp: просто скажите if (dp == bp) . . Компилятор C++ автоматически преобразует оба указателя в один и тот же тип, в данном случае в Base* , а затем сравнивает их. В зависимости от деталей реализации компилятора C++ это преобразование иногда изменяет биты значения указателя.

(Техническое замечание: большинство компиляторов C++ используют макет бинарного объекта, что приводит к тому, что это преобразование происходит с множественным наследованием и/или виртуальным наследованием. Однако язык C++ не навязывает такой макет объекта, поэтому в принципе преобразование также может происходить даже с невиртуальное одиночное наследование.)

Суть проста: ваш компилятор C не будет знать, как выполнить это преобразование указателя, поэтому преобразование из Derived* в Base*, например, должно выполняться в коде, скомпилированном с помощью компилятора C++, а не в коде, скомпилированном с помощью компилятор C.

ПРИМЕЧАНИЕ: вы должны быть особенно осторожны при преобразовании обоих значений в void*, так как это преобразование не позволит компилятору C или C++ правильно настроить указатель! Сравнение (x == y) может быть ложным, даже если (b == d) верно:

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

Вы предупреждены.

Если вы действительно хотите использовать указатели void*, вот безопасный способ сделать это:

Может ли моя функция C напрямую обращаться к данным в объекте класса C++?

(Основную информацию о передаче объектов C++ в/из функций C см. в предыдущем разделе часто задаваемых вопросов).

Вы можете безопасно получить доступ к данным объекта C++ из функции C, если класс C++:

  • Не имеет виртуальных функций (включая унаследованные виртуальные функции)
  • Все данные находятся в одном разделе уровня доступа (частный/защищенный/общедоступный)
  • Не имеет полностью содержащихся подобъектов с виртуальными функциями

Если класс C++ вообще имеет какие-либо базовые классы (или если какие-либо полностью содержащиеся подобъекты имеют базовые классы), доступ к данным будет технически непереносимым, поскольку структура класса при наследовании не навязывается языком. Однако на практике все компиляторы C++ делают это одинаково: сначала появляется объект базового класса (слева направо в случае множественного наследования), а затем следуют объекты-члены.

Более того, если класс (или любой базовый класс) содержит какие-либо виртуальные функции, почти все компиляторы C++ помещают в объект void* либо в местоположении первой виртуальной функции, либо в самом начале объекта. Опять же, этого не требует язык, но так делают «все».

Если у класса есть виртуальные базовые классы, он становится еще более сложным и менее переносимым. Один общий метод реализации заключается в том, чтобы объекты содержали объект виртуального базового класса ( V ) последним (независимо от того, где V отображается как виртуальный базовый класс в иерархии наследования). Остальные части объекта появляются в обычном порядке.Каждый производный класс, имеющий V в качестве виртуального базового класса, фактически имеет указатель на часть V конечного объекта.

Почему мне кажется, что я «далече от машины» в C++, а не в C?

Потому что это так.

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

Одной из сильных сторон C является тот факт, что он не имеет «скрытого механизма»: что вы видите, то и получаете. Вы можете прочитать программу на C и «увидеть» каждый такт. В C++ это не так; Программисты старой линии C (такие, как когда-то были многие из нас) часто относятся к этой функции неоднозначно (можете сказать, «враждебно»?). Однако после того, как они перешли к объектно-ориентированному мышлению, они часто понимают, что, хотя C++ скрывает от программиста некоторые механизмы, он также обеспечивает уровень абстракции и экономию выражений, что снижает затраты на обслуживание без снижения производительности во время выполнения.

Естественно, вы можете писать плохой код на любом языке; C++ не гарантирует какого-либо определенного уровня качества, возможности повторного использования, абстракции или любой другой меры "хорошего качества".

C++ не пытается сделать так, чтобы плохие программисты не могли писать плохие программы; это позволяет разумным разработчикам создавать превосходное программное обеспечение.

Имена элементов программы, таких как переменные, функции, классы и т. д., должны быть объявлены до того, как их можно будет использовать. Например, вы не можете просто написать x = 42 без предварительного объявления 'x'.

Объявление сообщает компилятору, является ли элемент типом int, double, функцией, классом или чем-то еще. Кроме того, каждое имя должно быть объявлено (прямо или косвенно) в каждом файле .cpp, в котором оно используется. При компиляции программы каждый файл .cpp компилируется независимо в единицу компиляции. Компилятор не знает, какие имена объявлены в других единицах компиляции. Это означает, что если вы определяете класс, функцию или глобальную переменную, вы должны предоставить объявление этой вещи в каждом дополнительном файле .cpp, который ее использует. Каждое объявление этой вещи должно быть абсолютно идентичным во всех файлах. Небольшое несоответствие вызовет ошибки или непреднамеренное поведение, когда компоновщик попытается объединить все единицы компиляции в одну программу.

В Visual Studio 2019 функция модулей C++20 представлена ​​как улучшение и возможная замена файлов заголовков. Дополнительные сведения см. в разделе Обзор модулей в C++.

Пример

В следующем примере показан распространенный способ объявления класса и последующего его использования в другом исходном файле. Начнем с заголовочного файла my_class.h. Он содержит определение класса, но обратите внимание, что определение неполное; функция-член do_something не определена:

В файле реализации мы можем дополнительно использовать оператор using, чтобы не уточнять каждое упоминание "my_class" или "cout" с помощью "N::" или "std::". Не помещайте операторы using в заголовочные файлы!

После того как компилятор завершит компиляцию каждого файла .cpp в файлы .obj, он передает файлы .obj компоновщику. Когда компоновщик объединяет объектные файлы, он находит ровно одно определение для my_class; он находится в файле .obj, созданном для my_class.cpp, и сборка завершается успешно.

Включить охрану

Что поместить в заголовочный файл

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

  • встроенные определения типов в пространстве имен или глобальной области видимости
  • определения невстроенных функций
  • неконстантные определения переменных
  • агрегированные определения
  • безымянные пространства имен
  • использование директив

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

Пример файла заголовка

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

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