LINUX.ORG.RU

Модули

 


0

2

здрасте, здрасте люди добрые!

пожалуйста объясните что такое модули в С++

чем они отличаются от заголовочных файлов?

я начинающий. услышал звон но не понимаю где он.

если нетрудно найдите время чтобы объяснить

Ответ на: комментарий от Assembler

попытаюсь сейчас написать в качестве тренировки свой первый модуль на С++

Ну давай. Расскажи потом как чего.

Zhbert ★★★★★
()

Какая-нибудь новомодная выдумка. Пиши на C89 и не морочь себе голову.

Legioner ★★★★★
()
Ответ на: комментарий от Zhbert

ну ожидаемо! думал щас как на python импортирую модуль.


mudule.cpp


export myfirstmodule;


void foo(){std::cout <<"hi";}

mainfile.cpp

#include <iostream>

export myfirstmudule;

int main()

{

return 0;
}

я что то не понял суть. это же не заголовочный файл. посути его не надо подключать через #include «»

если так, то смысла от таких модулей ноль. подскажите как скомпилировать ? gcc 9.2.0

Assembler
() автор топика
Ответ на: комментарий от Assembler

file.h

void foo(){std::cout << «hi»;}

main.cpp
#include <iostream>
#include "file.h"


int main()

{

foo();
}

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

Assembler
() автор топика
Ответ на: комментарий от Assembler

source gcc 10 версии еще не видел. подожду

Поезд для GCC 10, вроде, уже уехал. Они новый релиз начинают готовить с января и до мая там только баги фиксят. Так что даже если завтра модули смержат, это уже будет в GCC 11.

xaizek ★★★★★
()
Ответ на: комментарий от DELIRIUM

в gcc привычнее. за мысль огромное спасибо

Assembler
() автор топика
Ответ на: комментарий от xaizek

Судя по примеру — вырвиглазный неинформативный синтаксис. Сначала пишется слово module; потом уже export module xxx;

Неужели нельзя было сделать что-то типа unit в объектном паскале (которому, блин, 30 лет) или package в Java (которая чуток помоложе)? Там сразу задаётся имя.На Modula 2 можно посмотреть, которая ещё старше…

В этом синтаксисе есть какой-то глубокий смысл? Или просто люди за полвека (ещё с Си) покалечены препроцессором настолько, что не могут сделать красивую логичную конструкцию?

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

2 ТС

чем они отличаются от заголовочных файлов?

Всем. Заголовочные файлы — это всего лишь стена текста для препроцессора. Подробнее я писал тут. Ирония в том, что по части модулей почти любой современный и даже не сильно современный ЯП выглядит лучше плюсов с их препроцессорными костылями. Поэтому нововведение само по себе очень нужное. Вот реализация пока вызывает вопросы…

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Судя по примеру — вырвиглазный неинформативный синтаксис.

+1

Как всегда в крестах: идея правильная, а реализация — мда…

Deleted
()
Ответ на: комментарий от hobbit

В этом синтаксисе есть какой-то глубокий смысл?

Конечно есть. И да, мы можем просто указывать module с именем.

// math.mpp, декларация
export module math; 

export int add(int fir, int sec);
// math.cpp , реализация
module math;

int add(int fir, int sec){
    return fir + sec;
}

Проблема в том, что в нашем модуле, мы не можем пользоваться include, потому что в модулях нет макросов.

// нельзя
module my_game;
#include <SDL.h>

Мы можем лишь так

module my_game;
import <SDL.h>;

Но это импортирует нам лишь функции и переменные, классы, шаблоны, но не макросы. Но нам нужны макросы. Тогда и решили сделать unnamed module, который не будет экспортироваться, но в котором разрешены #include

module;

#include <windows.h>

// можно и свои макросы определить

module bar;

// Win32 макросы и функции и всё-всё доступно

Если макросы не нужны, то будет как в Java/Pascal.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 2)
Ответ на: комментарий от fsb4000

Спасибо.

math.mpp

mpp

Это расширение предлагается в качестве стандартного? Если да, какие-нибудь IDE его уже поддерживают? Например, в Qt Creator я сейчас могу по F4 переключаться между *.h и *.cpp, пройдёт ли такой трюк с *.mpp и *.cpp?

Понятно, что стандарт только принят, но в черновиках это, как я понимаю, болталось уже давно, может, кто и запилил…

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Файлы расширения - это один момент. Но в любом случае, как я понял, qtcreator использует краденный clang для online синтаксического анализа. Так что сначала должна выйти версия clang, поддерживающая модули, а затем разрабы qtcreator должны синхронизировать своего креакла с данной версией clang.

seiken ★★★★★
()
Ответ на: комментарий от fsb4000

Безымянный модуль как концепция новой свалки глобального сваливания всей макроты или я что-то неправильно понимаю из ваших слов? :)

abcq ★★
()
Ответ на: комментарий от hobbit

Это расширение предлагается в качестве стандартного?

Ну я встречал два расширения для деклараций cppm и mpp. В примерах для gcc/clang. А у Microsoft вообще своё требование, чтобы в IDE работало…

The .ixx extension is required for module interface files in Visual Studio.

Реализация модуля вроде везде cpp.

Хотя компилятору, конечно, плевать на имена файлов:

cl.exe /std:c++latest /experimental:module /TP /EHsc /MD /c math.cppm /module:interface /Fo: math.pcm.obj /module:output math.pcm 
cl.exe /std:c++latest /experimental:module /TP /EHsc /MD /c math.cpp /module:reference math.pcm /Fo: math.obj                      
cl.exe /std:c++latest /experimental:module /TP /EHsc /MD /c main.cpp /module:reference math.pcm /Fo: main.obj                      
cl.exe math.obj main.obj math.pcm.obj  
fsb4000 ★★★★★
()
Ответ на: комментарий от abcq

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

только если макросы нужны для реализации. Да.

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

import "myheader.h"

Preprocessor definitions in any files included by that header are not visible.

Ну и да, совсем от include видимо не уйти с текущей концепцией модулей, вот даже в мануалах советуют:

You can use a traditional header file to control which modules are imported:

// MyProgram.h
import std.core;
#ifdef DEBUG_LOGGING
import std.filesystem;
#endif
fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Но это же просто условная компиляция при помощи препроцессора. Препроцессор как таковой вроде бы никто убивать не собирался.

seiken ★★★★★
()
Ответ на: комментарий от Assembler

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

спасибо всем, кто нашел время и попытался объяснить что такое модули.

Assembler
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.