LINUX.ORG.RU

Модули

 


0

2

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

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

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

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

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

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

Шланг модули умеет вроде с 6. Я их там тестировал. Ещё у него в tools-extra есть тулза modularize. Попробуй.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от 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)
Ответ на: комментарий от 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.