Youtube - C++ Modules Getting Started Today - Andreas Weis - CppCon 2023

C++ Modules: Getting Started Today - Andreas Weis - CppCon 2023

https://www.youtube.com/watch?v=_x9K9_q2ZXE

Transcrição

 06:47

Motivação

 06:20

Módulos

06:37

exemplo de programa Alo mundo
Pasted image 20231213123601.png

 07:00
// File: module.cpp
export module my_module;

export char const* my_function()
{
	return "Hello Modules";
}

//*ile: main.cpp
#include <print>
import my_module
int main()
{
	std::println("{}", my_funcion() );
}
07:47

Nomes de módulos precisam ser únicos por todo o programa

 08:06

Módulos não possuem necessidade de usar namespaces. Embora seja boa prática.
Pasted image 20231213123647.png

08:34

Uma importante diferença entre headers pré-compilador é que no caso de módulos nós precisamos explicitar tudo o que desejamos tornar disponível para nossos clientes explicitamente com export.

 08:47

Podemos exportar:

  1. Funções
  2. Tipos
  3. Template de classe e funções
 10:18
  1. namespaces, mas se for abrir novamente o mesmo namespace em outro lugar, será necessário declarar novamente export
    Pasted image 20231213123704.png
 10:53
  1. using declaration
    Pasted image 20231213123715.png
 11:39
  1. Blocos export
 12:21
  1. Módulo inteiro pode ser exportado
 13:03
Warning

Mesmo não usando export, isso não significa que uma classe estará completamente inacessível

Quando não exportamos algo, o que somos impedidos é de referenciar a estrutura através de um nome.
Pasted image 20231213123745.png

 15:00

#recommended Daniela Engert - The three secret spices of C++ Modules - Visibility, Reachability, Linkage

 15:26

Primary Module Interface Unit

// File: my_module.cpp
export module my_module;

export char const * my_function()
{
return "Hello Modules!";
}
 19:03

Module Interface partitions

Pasted image 20231213123949.png

 22:02

Pasted image 20231213143945.png
#recommended talk about header units, not good idea to use in production

 22:58

Pasted image 20231213144042.png

 23:40

Building modules with CMake - old School

Pasted image 20231213144152.png

cmake_minimum_required(VERSION 3.27) 
project(my.project)

add.executable(my.executable) target.sources(my.executable PUBLIC {PR0JECT.SOURCE.DIR}/inc/my.headerl.hpp {PROJECT_SOURCE_DIR}/inc )

Building with CMake since v3.23

 25:03

Pasted image 20231213144407.png

cmake.minimum.required(VERSION 3.27) project(my.proj ect)
add.executable(my.executable) 
target.sources(my.executable PUBLIC 
	{PR0JECT.SOURCE.DIR}/inc
FILES
{PROJECT.SOURCE.DIR}/inc/my.header2.hpp
)
 26:04

Pasted image 20231213150121.png

 26:37

Pasted image 20231213150328.png

 27:25

Pasted image 20231213150349.png

Module File Extensions

 30:05

Pasted image 20231213151311.png

Warning

#error-prone #best-practices Não use estas extensões de módulos para arquivos regulares, porque o compilador pode aplicar o build errado e gerar um erro de compilação.

 31:23

Pasted image 20231213151700.png

 31:49

Pasted image 20231213151728.png

 33:57

Pasted image 20231213152026.png

 34:38

Pasted image 20231213152147.png

 35:46

Pasted image 20231213152330.png

 36:02

Pasted image 20231213152346.png

 38:25

Pasted image 20231213152659.png

Advices && Pitfalls

 41:23

Pasted image 20231213154218.png

standard library

Quando a biblioteca padrão não usar módulos

 41:55

Pasted image 20231213205855.png
Coloque entre esses dois fragmentos de código (module) os includes

 44:13

Pasted image 20231213210143.png

 44:39

Pasted image 20231213210534.png

 46:39

Pasted image 20231213211301.png

Warning

#best-practices Quando misturar includes com módulos no mesmo arquivo, sempre colocar includes primeiro

 48:17

Pasted image 20231213213423.png

Pasted image 20231213214819.png

Macros não são exportadas em módulos

Pasted image 20231213220626.png

Workaround para macros

 52:28

Pasted image 20231213220700.png

 53:19

Pasted image 20231213220945.png

 54:09

Pasted image 20231219125029.png

 56:39

Pasted image 20231219125056.png

#recommended Where to go from here...