Как подключить модуль в с
Перейти к содержимому

Как подключить модуль в с

  • автор:

Как правильно подключать .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

Модули в TypeScript

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

Экспорт и импорт модулей в TypeScript

Загрузка модулей

Для загрузки модулей определим в папке со скомпилированными файлами веб-страницу 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");

Структура финального проекта:

Загрузка модулей TypeScript

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

node server.js

Загрузка модулей в TypeScript и Node.js

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

Загрузка модулей в TypeScript и Node.js

Конфигурация 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.

  1. Пройдите на страницу “Управление модулями” в панели администратора.
  2. Нажмите кнопку + для загрузки и установки нового модуля.
  3. В открывшемся окне (“Загрузить и установить модуль”) выберите архив с модулем. Вы можете установить модуль, выбрав архив в формате tgz, gz, zip и нажав “Загрузить и установить”.
  4. Установщик модуля проверит права на запись файлов и папок. Если прав недостаточно, то вы получите уведомление. Вы сможете установить права на запись на указанные папки веб-сервера или предоставить FTP-доступ с правами записи в эти папки.
  5. Модуль установлен.

Ручная установка модуля¶

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

  1. Распакуйте архив с модулем в основной каталог веб-сервера или перенесите все файлы из архива вручную (сохранив структуру).
  2. Пройдите на страницу “Управление модулями” в панели администратора.
  3. Найдите новый модуль в списке и нажмите кнопку Установить. Готово!

Страница “Управление модулями” и настройки модуля¶

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

Модули могут иметь индивидуальные настройки. Для перехода на страницу настроек модуля нажмите на название модуля или Шестерёнка → Редактировать.

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

Содержание

  • Установка и переезд

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *