LINUX.ORG.RU

Модули из C++20

 


1

5

Какие IDE и системы сборки поддерживают их из коробки под онтопиком? Насколько я слышал, сейчас поддержка из коробки есть только под виндой в VS2022.

★★★★★
  1. build2 + gcc: https://build2.org/ и https://build2.org/blog/build2-cxx20-modules-gcc.xhtml

  2. будущий CMake(3.24 ?) с патченным gcc: https://gitlab.kitware.com/cmake/cmake/-/issues/18355#note_1179696

  3. Makefile: поддерживает и clang и gcc:

clang++ -std=c++20 --precompile -fprebuilt-module-path=. -c mod.cppm -o mod.pcm
clang++ -std=c++20 -fprebuilt-module-path=. main.cpp mod.pcm
clang++ -x c++-module -std=c++20 -fmodules -fbuiltin-module-map -stdlib=libc++ --precompile a.cc
clang++ -std=c++20 -fmodules -fbuiltin-module-map -fmodule-file=a.pcm -stdlib=libc++ -c a-impl.cc

или так:

g++- -std=c++20 -fmodules-ts -c -x c++-system-header vector iostream
g++- -std=c++20 -fmodules-ts -c foo.cc -o foo.o
g++- -std=c++20 -fmodules-ts -c main.cpp -o main.o
g++- -std=c++20 -fmodules-ts foo.o main.o -o foo.x

какие-то такие команды нужны, я в основном Visual C++ пользуюсь.

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

Можно ликбез?

  1. насколько гранулирована будет std в перспективе? Модули будут собраны по границам namespace’ов (std; std::threads; std::chrono)? Каждый инклуд - модуль (iostream, …)? Или всё будет как-то иначе?

  2. Где компилятор хранит собранные модули? Например, установил некую либу, которая собирается в модуль, компиль родил модуль, где он будет храниться (другими словами - создают ли текущие тестовые модульные реализации of компиляторы/build_systems некий глобальный кэш для переиспользования)?

kvpfs ★★
()
Ответ на: комментарий от kvpfs
  1. Нет. Будет лишь два модуля.

std

и

std.compat

std будет иметь всё что будет в namespace std, включая Сишные обёртки std::malloc, std::free

std.compat будет иметь всё что в std и все остальные функции которые в глобальном namespace: malloc, free и так далее.

Вначале хотели делать более гранулированно, но потом посмотрели что даже с одним модулем всё гораздо быстрее в сравнении с одним #include <iostream>.

Но так как именованные модули не содержат макросы, то #include ещё будет нужен для #include <cassert> или #include <version>

Но имена модулей std.* являются зарезервированными. Так что в будущем могут быть ещё модули кроме std.compat

https://open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2465r2.pdf

  1. В папке проекта, глобального кеша нет, по крайней мере в msbuild так. (для стандартной библиотеки, наверное, компилятор будет использовать уже собранный модуль)
fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Спасибо. Только чет за assert() обидно, как-то костыльно с ним вышло, по-моему можно было вкрутить шаблонный аналог, который может легко заоптимизироваться в релизе.

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

Только чет за assert() обидно, как-то костыльно с ним вышло

Там чуть больше всего, кроме assert, видимо поэтому и не стали:

For assert, errno, offsetof, va_arg, etc., users must #include<meow.h> or #include<cmeow>. (<assert.h>/<cassert> are extra-special as they can be repeatedly included with varying behavior controlled by NDEBUG.

fsb4000 ★★★★★
()

Да, так и есть. Я пытался какое-то время назад, под линуксом стандартная библиотека была без модулей.

Модули... модули? Какие модули?!

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

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

Это победа.

В самой первой ревизии этого предложения Бьярне тестировал компиляцию с модулями(в 2021 году):

https://open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2412r0.pdf

https://imgur.com/a/shORngv

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

Makefile: поддерживает и clang и gcc

В этом случае достаточно непатченного gcc? Если да, то с какой версии gcc работает?

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

С gcc-11. Но баги возможны, с другой стороны если не говорить разработчикам что конкретно не работает, то это может так и остаться сломанным.

Вот такой Hello World у меня заработал на gcc version 11.3.0 (Rev1, Built by MSYS2 project)

#makefile
foo.o: foo.cpp
	g++ -std=c++20 -fmodules-ts -c foo.cpp -o foo.o

foo_impl.o: foo_impl.cpp foo.o
# Я не знаю как добавить зависимости в цели чтобы iostream не пересобирался каждый раз для foo_impl.o :(
	g++ -std=c++20 -fmodules-ts -c -x c++-system-header iostream
	g++ -std=c++20 -fmodules-ts -c foo_impl.cpp -o foo_impl.o

main.o: main.cpp foo.o
	g++ -std=c++20 -fmodules-ts -c main.cpp -o main.o

test: main.o foo.o foo_impl.o
	g++ -std=c++20 -fmodules-ts foo.o foo_impl.o main.o -o test

.DEFAULT_GOAL := test
// main.cpp
import foo;

int main(){
    foo::hello();
}
// foo.cpp
export module foo;

namespace foo {
    export void hello();
}
// foo_impl.cpp
module foo;

import <iostream>;

namespace foo {
    void hello() {
        std::cout << "Hello, world\n";
    }
}
fsb4000 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.