Как правильно подключать .cpp модули?
Есть файл core.cpp с некоторыми функциями. Как правильно подключить core.cpp к моему проекту? Кроме того, и в core.cpp , и в главном модуле проекта, содержится директива #include
Отслеживать
397 2 2 золотых знака 10 10 серебряных знаков 39 39 бронзовых знаков
задан 22 июл 2013 в 15:49
1,269 2 2 золотых знака 21 21 серебряный знак 56 56 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Что означает «подключить файл к проекту»? Исходя из windows.h , вы пользуетесь MSVC, так что просто добавьте файл в проект через правый клик -> Add existing item. Файл скомпилируется с проектом.
Если вы хотите пользоваться функциями из core.cpp , вам необходимо описание этих функций в header’е. Вам придётся либо раздобыть core.h там же, где вы взяли core.cpp , либо написать его самому.
Конфликта инклюдов не будет. Правильно написанный header можно включать сколько угодно раз как в одном файле, так и (тем более) в разных.
Отслеживать
ответ дан 22 июл 2013 в 16:11
206k 28 28 золотых знаков 291 291 серебряный знак 526 526 бронзовых знаков
- c++
- visual-c++
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как подключить модуль в с
TypeScript поддерживает работу с модулями. Модули являются концепцией, привнесенной стандартом ES2015. Модули в некотором смысле похожи на пространства имен: они могут заключать различные классы, интерфейсы, функции, объекты. Модули выделяются в отдельные файлы, что позволяет сделать код приложения более ясным и чистым, и в то же время позволяет использовать модули в других приложения.
В TypeScript, как и в стандарте ECMAScript 2015, любой файл, который содержит выражения import или export верхнего уровня, рассматривается как модуль. Модули выполняются не в глобальном контексте, а в своей собственной области видимости. То есть переменные, функции, классы. интерфейсы и т.д., определенные внутри модуля, не доступны извне, пока они не будут явным образом экспортированы. А чтобы другой модуль мог их использовать, он должен их импортировать.
Если файл не содержит выражений import или export верхнего уровня, он рассматривается как обычный скрипт, содержимое которого доступно в глобальной области видимости. Такие файлы можно склеить в один с помощью параметра компиляции —outFile , которому передается название выходного файла.
Чтобы сделать из простого скрипта модуль, достаточно добавить в файл
export <>;
Этот модуль ничего не экспортирует, но тем не менее это модуль.
Типы модулей
Все модули имеют определенный формат и относятся к определенном типу. Всего мы можем использовать следующие типы модулей:
- AMD (Asynchronys Module Definition)
- CommonJS (используется по умолчанию, если параметр —target равен «ES3» или «ES5»)
- UMD (Universal Module Definition)
- System
- ES 2015
- ES 2020
- ESNext
Модули типов ES2015 и ES2020 практически одинаковы за тем исключение, что ES2020 имеет поддержку для динамического импорта и выражения импорта import.meta .
Рассмотрим модули на примере модулей типа ES2015/ES2020, поскольку это один из наиболее популярных типов (наряду с CommonJS), кроме того, этот тип модулей современные браузеры поддерживают по умолчанию.
Определение модуля
Определим простейший модуль. Для этого создадим файл message.ts , в котором определим следующий код:
export default function hello()
Здесь определена обычная функция hello() , которая выводит некоторое сообщение на консоль. Но она определена с ключевым словом export , а это значит, что данный файл представляет модуль, а функцию hello() можно импортировать в другие модули.
Кроме того, здесь применяется ключевое слово default , которое устанавливает тип, экспортируемый по умолчанию.
Подключение модуля. Импорт
Теперь подключим эту функцию в другой файл. Для этого возьмем файл main.ts :
import hello from "./message.js"; hello();
Для подключения функционала из другого модуля применяется ключевое слово import , после которого идут названия подключаемых компонентов — в данном случае функция hello. Затем после оператора from указывается модуль, из которого идет импорт. В данном случае указываем «./message.js». В данном случае предполагается что оба скомпилированных модуля — main.js и message.js будут находиться в одной папке.
Компиляция модуля
При компиляции из командной строки или терминала для установки модуля необходимо передать соответствующее значение параметру —module :
tsc --module commonjs main.ts // для CommonJS tsc --module amd main.ts // для AMD tsc --module umd main.ts // для UMD tsc --module system main.ts // для SytemJS tsc --module esnext main.ts // для ESNext
В данном случае у нас оба модуля — main.ts и message.ts являются модулями ES, то есть в качестве типа модуля необходимо выбрать «ES2015», «ES2020» или «ESNext». Для данного конкретного случае не столь важно, какой именно из этих трех типов выбирать, поэтому выберем последний вариант.
Сначала перейдем в командной строке/консоли с помощью команды cd к папке, где расположены файлы main.ts и message.ts. Так, в моем случае они расположены в папке c:\typescript
Далее для компиляции модулей введем команду:
tsc main.ts --module esnext

После этого в папке появятся файлы main.js и message.js.

Загрузка модулей
Для загрузки модулей определим в папке со скомпилированными файлами веб-страницу index.html :
Metanit.com Модули в TypeScript
Для загрузки главного модуля приложения — main.js определяется элемент , у которого устанавливается атрибут type=»module» .
Загрузка модулей производится через AJAX, поэтому скомпилированные модули должны быть размещены на веб-сервере. То есть у нас не получится просто кинуть страницу в веб-браузер, как, например, это было в первых темах. Поэтому прежде всего надо определиться с веб-сервером. Веб-сервер может быть любым. В данном случае воспользуемся самым демократичным вариантом — Node.js. Но опять же вместо node.js это может быть любая другая технология сервера — php, asp.net, python и т.д. либо какой-то определенный веб-сервер типа Apache или IIS.
Итак, создадим в папке с файлами модулей файл сервера. Пусть он будет называться server.js и будет иметь следующий код:
const http = require("http"); const fs = require("fs"); http.createServer(function(request, response) < // получаем путь после слеша let filePath = request.url.substr(1); if(filePath == "") filePath = "index.html"; fs.readFile(filePath, function(error, data)< if(error)< response.statusCode = 404; response.end("Resourse not found!"); >else < if(filePath.endsWith(".js")) response.setHeader("Content-Type", "text/javascript"); response.end(data); >>); >).listen(3000, function()< console.log("Server started at 3000"); >);
Это самый примитивный сервер, который отдает пользователю статические файлы. Для создания сервера применяется функция http.createServer() , а для считывания и отправки файлов — функция fs.readFile() . Если имя файла не указано, то отправляется файл index.html . Сервер будет запускаться по адресу http://localhost:3000/
Стоит отметить, что при отправке модулей js нам надо устанавливать mime-тип отправляемого контента в «text/javascript» :
if(filePath.endsWith(".js")) response.setHeader("Content-Type", "text/javascript");
Структура финального проекта:

Теперь запустим сервер с помощью команды
node server.js

После запуска сервера мы можем перейти в браузере по адресу http://localhost:3000, нам отобразится страница, а в консоли браузера мы сможем увидеть результат работы нашего кода на typescript:

Конфигурация typescript
Вместо того, чтобы указывать тип модуля в консоли при компиляции, можно использовать соответствующие параметры в файле конфигурации tsconfig.json . Так, параметр module задает тип модуля:
Как подключить модуль в с
Вопрос вызван в основном нехватой опыта при написании коммерческих модулей, так как я еще далеко новичек в этом деле.
Дело в то что модули уже выполнены и протестированы, проходят последний этап исправлений (в основном на внешность)
И вот после исправлений возник такой вопрос.. (Пожалййста не цепляйтесь к словам так как мне возможно будет трудно выразить свои мысли)
Вопрос..
А как же правильно подключить другие модули, используемые моим модулем в работе.
Есть несколько соображений по этому поводу.
1) И в .hpp и .cpp вписать и там и там #include .
2) Все модули вписать в .hpp а в .cpp ничего не вписывать
3) Постаратся чтобы все модули не имеющие значения в .hpp файле были прописаны в .cpp
А в .hpp прописать необходимый ему минимум
4) Все модули прописать в .cpp но и в .hpp прописать только необходимый ему минимум.
Я выбрал 3 путь так как считаю что нечего тем кускам программы что используют мой модуль «знать» слишком много.
Иначе может произойти ситуация когда при переносе модуля в другую программу прийдется долго гадать что забыли подклюить.. (может не долго но всеравно это некрасиво и является невыявленной ошибкой программиста)
Подскажите пожалуйста правильно ли я отталкиваюсь в данном вопросе, и пожалуйста поделитесь со мной опытом и взглядами на данный вопрос.
Если я слишком сильно загоняюсь по такому совсем детскому вопросу или в чемто неправ то приношу свои извинения.. Уж эти знания обошли меня стороной и приходится волноватся необходимы ли они или нет.
Re: Как правильно подключать модули?
| От: | Сергей Савостин |
| Дата: | 26.07.09 20:29 |
| Оценка: |
До последнего проекта делал п.2
Сейчас пробую делать в .h(pp) писать
class TMyClass;
а #include уже в .cpp
могут возникнуть сложности в template функциях и у других ситуациях, когда полное описание класса нужно в .h(pp)
ЗЫ. Как правильно не знаю. Тоже жду совета от гуру.
Re: Как правильно подключать модули?
| От: | _Ursus_ |
| Дата: | 26.07.09 21:45 |
| Оценка: |
В .h файлах прописываются только минимально необходимые им инклуды.
Все инклуды, нужные .cpp файлам, обычно выносятся в общий файл типа common.h или stdafx.h (часто используемые) , а частично — прописываются в самих .cpp (используемые редко).
Re[2]: Как правильно подключать модули?
| От: | tatsu |
| Дата: | 27.07.09 05:06 |
| Оценка: |
Здравствуйте, _Ursus_, Вы писали:
_U_>В .h файлах прописываются только минимально необходимые им инклуды.
_U_>Все инклуды, нужные .cpp файлам, обычно выносятся в общий файл типа common.h или stdafx.h (часто используемые) , а частично — прописываются в самих .cpp (используемые редко).
Ага! Вот оно наверное пришло.. то время когда пора узнать подробности что же такое знаменитый упоминаемый файл «stdafx.h».. Буду гуглить и знакомиться.
Все что вы написали я хорошо понял кроме одного.
Это получается при прописывании этих самых используемых модулей в «stdafx.h» то я в .cpp файлах должен вписывать #include «stdafx.h»? И файл stdafx.h я должен самостоятельно создавать в среде?
Огромное спасибо за информацию
Re[2]: Как правильно подключать модули?
| От: | K13 | http://akvis.com |
| Дата: | 27.07.09 05:18 | |
| Оценка: | +3 | |
_U_>В .h файлах прописываются только минимально необходимые им инклуды.
_U_>Все инклуды, нужные .cpp файлам, обычно выносятся в общий файл типа common.h или stdafx.h (часто используемые) , а частично — прописываются в самих .cpp (используемые редко).
Вот только с precompiled headers мне приходилось нарываться на интересные глюки при смене платформы/компилятора,
а без такой фичи stdafx.h — зло.
Каждый .cpp должен инклюдить только то что необходимо для его компиляции.
Если есть возможность обойтись class Foo; вместо #include «foo.h» стоит так и писать, особенно в хидерах.
Как только приходится сталкиваться с достаточно большим проектом, необходимость такого правила становится очевидной.
Re[3]: Как правильно подключать модули?
| От: | Сергей Савостин |
| Дата: | 27.07.09 11:16 |
| Оценка: |
K13>Каждый .cpp должен инклюдить только то что необходимо для его компиляции.
K13>Если есть возможность обойтись class Foo; вместо #include «foo.h» стоит так и писать, особенно в хидерах.
K13>Как только приходится сталкиваться с достаточно большим проектом, необходимость такого правила становится очевидной.
Да, а то исправишь гденить один символ и собираешь потом проект минут 10.
А вот в том же Борланде (старая школа? Борланд — зло по-умолчанию?) почти все инклюды — в хеадере.
Re[4]: Как правильно подключать модули?
| От: | tatsu |
| Дата: | 07.08.09 10:03 |
| Оценка: |
Здравствуйте, Сергей Савостин, Вы писали:
K13>>Каждый .cpp должен инклюдить только то что необходимо для его компиляции.
K13>>Если есть возможность обойтись class Foo; вместо #include «foo.h» стоит так и писать, особенно в хидерах.
K13>>Как только приходится сталкиваться с достаточно большим проектом, необходимость такого правила становится очевидной.
СС>Да, а то исправишь гденить один символ и собираешь потом проект минут 10.
СС>А вот в том же Борланде (старая школа? Борланд — зло по-умолчанию?) почти все инклюды — в хеадере.
Насколько сам знаком с продуктами борланда.. Они изначально пошустрее проекты собирают. Вот зато при написани очень больших проектов можно столкнутся с большими неприятностями с работой с кодом, иногда просто происходят баги в редакторе кода..
Но это в старых версиях борланда.. Хотя в новых тоже хватает недостатков.
В общем у каждого свои тараканы Х) ИМХО нужно уметь пользоваться средой и тогда она будет лучшим другом)
Re[3]: Как правильно подключать модули?
| От: | tatsu |
| Дата: | 07.08.09 10:08 |
| Оценка: |
Здравствуйте, K13, Вы писали:
_U_>>В .h файлах прописываются только минимально необходимые им инклуды.
_U_>>Все инклуды, нужные .cpp файлам, обычно выносятся в общий файл типа common.h или stdafx.h (часто используемые) , а частично — прописываются в самих .cpp (используемые редко).
K13>Вот только с precompiled headers мне приходилось нарываться на интересные глюки при смене платформы/компилятора,
K13>а без такой фичи stdafx.h — зло.
K13>Каждый .cpp должен инклюдить только то что необходимо для его компиляции.
K13>Если есть возможность обойтись class Foo; вместо #include «foo.h» стоит так и писать, особенно в хидерах.
K13>Как только приходится сталкиваться с достаточно большим проектом, необходимость такого правила становится очевидной.
Видел такие записи вот только счас начинаю понимать для чего они были))
Если я правильно понял это чтобы не включать целиком весь модуль а лишь подключить нужный класс, структуру и т.п.
Как я понимаю класс будет найден в данном случаем уде при линковке, а это не будет влиять на работу с кодом в редакторе.. Т.е. когда среда подсказывает какие есть переменные\функции в классе, показывает какие переменные необходимо передавать функциям класса и т.п?
Re[4]: Как правильно подключать модули?
| От: | K13 | http://akvis.com |
| Дата: | 07.08.09 10:28 | |
| Оценка: |
T>Видел такие записи вот только счас начинаю понимать для чего они были))
T>Если я правильно понял это чтобы не включать целиком весь модуль а лишь подключить нужный класс, структуру и т.п.
T>Как я понимаю класс будет найден в данном случаем уде при линковке, а это не будет влиять на работу с кодом в редакторе.. Т.е. когда среда подсказывает какие есть переменные\функции в классе, показывает какие переменные необходимо передавать функциям класса и т.п?
Нет. это нужно для того, чтобы не включать класс там где он не нужен.
Если какой-то кусок всего лишь получает в параметрах указатель/ссылку на объект и потом передает его в другие функции «как есть», не вызывая методов и т.п., то этому куску не нужен полный класс и хватает class Foo;
Вот «будет ли среда подсказывать» — а фиг его знает. зависит от среды.
Да это и не так уж важно, по сравнению с выигрышем во времени сборки.
Re[3]: Как правильно подключать модули?
| От: | D14 | |
| Дата: | 07.08.09 10:38 | |
| Оценка: | +2 | |
Здравствуйте, K13, Вы писали:
K13>Вот только с precompiled headers мне приходилось нарываться на интересные глюки при смене платформы/компилятора,
K13>а без такой фичи stdafx.h — зло.
На то надо в .cpp прописывать все необходимые заголовки, как будто условный stdafx.h пуст. А в stdafx.h уже дублировать включение редко изменяемых заголовков.
Re[5]: Как правильно подключать модули?
| От: | Erop | |
| Дата: | 07.08.09 11:10 | |
| Оценка: | +1 | |
Здравствуйте, K13, Вы писали:
K13>Нет. это нужно для того, чтобы не включать класс там где он не нужен.
K13>Если какой-то кусок всего лишь получает в параметрах указатель/ссылку на объект и потом передает его в другие функции «как есть», не вызывая методов и т.п., то этому куску не нужен полный класс и хватает class Foo;
Есть ещё вариант, что хедеру определение класса не нужно, а cpp-шнику нужно. Тогда можно в хедере просто предварительно класс объявить, а определение включить из cpp-шника.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно «ради красного словца». За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Как правильно подключать модули?
| От: | tatsu |
| Дата: | 09.08.09 01:19 |
| Оценка: |
E>Есть ещё вариант, что хедеру определение класса не нужно, а cpp-шнику нужно. Тогда можно в хедере просто предварительно класс объявить, а определение включить из cpp-шника.
Хитро)) Спасибо!
Re[7]: Как правильно подключать модули?
| От: | Erop |
| Дата: | 09.08.09 01:25 |
| Оценка: |
Здравствуйте, tatsu, Вы писали:
T>Хитро)) Спасибо!
Не за что, но для «спасибо», тут есть кнопки
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно «ради красного словца». За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Установка и настройка модулей¶
Модуль можно установить автоматически через панель администратора или вручную, с помощью переноса файлов модуля на сервер.
Установка модуля в панели администратора¶
Только главный администратор может устанавливать модули из архива. Кнопка + не отображается для других групп администраторов.
Главный администратор — это администратор по умолчанию, создающийся системой после завершения установки CS-Cart. Чтобы проверить, является ли выбранная учётная запись администратора главной, в базе данных найдите таблицу cscart_users , где в поле is_root для выбранной учётной записи администратора должно стоять значение Y.
- Пройдите на страницу “Управление модулями” в панели администратора.

- Нажмите кнопку + для загрузки и установки нового модуля.

- В открывшемся окне (“Загрузить и установить модуль”) выберите архив с модулем. Вы можете установить модуль, выбрав архив в формате tgz, gz, zip и нажав “Загрузить и установить”.

- Установщик модуля проверит права на запись файлов и папок. Если прав недостаточно, то вы получите уведомление. Вы сможете установить права на запись на указанные папки веб-сервера или предоставить FTP-доступ с правами записи в эти папки.

- Модуль установлен.

Ручная установка модуля¶
Модуль представляет из себя архив с файлами и папками, расположенными таким образом, что его можно распаковать в основном каталоге интернет-магазина.
- Распакуйте архив с модулем в основной каталог веб-сервера или перенесите все файлы из архива вручную (сохранив структуру).

- Пройдите на страницу “Управление модулями” в панели администратора.

- Найдите новый модуль в списке и нажмите кнопку Установить.
Готово!
Страница “Управление модулями” и настройки модуля¶
Страница “Управление модулями” содержит информацию о модулях вашего интернет-магазина. На данной странице вы сможете включить/выключить, установить/удалить или отредактировать настройки модуля.

Модули могут иметь индивидуальные настройки. Для перехода на страницу настроек модуля нажмите на название модуля или Шестерёнка → Редактировать.
Если вы используете несколько витрин CS-Cart, то настройки модулей могут быть как индивидуальными для каждой витрины, так и общими для всех витрин (доступны при выбранном режиме администрирования “Все магазины”).

Содержание
- Установка и переезд
- Администрирование
- О панели администратора
- Внешний вид
- Модули или аддоны
- Установка и настройка модулей
- АТОЛ Онлайн
- Модуль “Блог”
- Модуль Boxberry
- Модуль “Города”
- Отзывы и комментарии
- CommerceML (Обмен данными)
- Конструктор форм
- Модуль “Определение местоположения”
- Подарочные сертификаты
- Google reCAPTCHA
- Модуль “Janrain”
- Модуль “Платежи через PayPal”
- Модуль “Вариации товаров”
- RetailCRM
- Модуль “Бонусные баллы”
- Подтверждение на обработку персональных данных (152-ФЗ)
- Налоговые ставки РФ
- Модуль “SEO”
- Социальные сети
- Модуль “Теги”
- Модуль “Tвигмо”
- Яндекс.Маркет
- Яндекс.Метрика
- YML экспорт
- Разработка
- Дизайн
- Обновление CS-Cart
- Часто задаваемые вопросы
- История изменений
Сейчас
- Установка и настройка модулей
- Установка модуля в панели администратора
- Ручная установка модуля
- Страница “Управление модулями” и настройки модуля