💻 Exemplos: Capítulo 19: Módulos do C++20 e Engenharia de Build com CMake Moderno

Especialização em Sistemas com C++ • Demonstrações Práticas Compiláveis


🎯 Objetivo dos Exemplos

Apresentar a substituição definitiva do modelo frágil de inclusão textual #include pelos Módulos do C++20 (export module, import), eliminando contaminações de macros de pré-processador e acelerando os tempos de compilação em projetos gigantescos, acompanhado da configuração industrial com CMake Moderno (3.28+).


1. Código Fonte Completo

Arquivo 1: engine.ixx (Interface do Módulo C++20)

/**
 * @file engine.ixx
 * @brief Unidade de interface de módulo C++20 (Module Interface Unit).
 */

export module telemetry.engine;

import <iostream>;
import <string>;
import <cstdint>;

export namespace Telemetry {

    struct MetricasCluster {
        std::uint64_t total_transacoes;
        double tempo_medio_us;
    };

    class MotorProcessamento {
    private:
        std::string m_id_servico;

    public:
        explicit MotorProcessamento(std::string id) : m_id_servico(std::move(id)) {}

        void inicializar() const {
            std::cout << "[Modulo telemetry.engine] Motor '" << m_id_servico 
                      << "' inicializado via C++20 Modules!" << '\n';
        }

        MetricasCluster coletar() const {
            return MetricasCluster{ 1500000ULL, 1.45 };
        }
    };

} // namespace Telemetry

Arquivo 2: main.cpp (Consumo do Módulo via import)

/**
 * @file main.cpp
 * @brief Consumo de módulo exportado com import no C++20.
 */

// Sintaxe moderna: sem cabeçalhos .h e sem macros invasivas!
import telemetry.engine;
import <iostream>;

int main() {
    std::cout << "=== CAPÍTULO 19: MÓDULOS C++20 E CMAKE MODERNO ===" << '\n';

    Telemetry::MotorProcessamento motor("Alpha_Gateway");
    motor.inicializar();

    auto metricas = motor.coletar();
    std::cout << "Total Transacoes: " << metricas.total_transacoes << '\n';
    std::cout << "Latencia Media:   " << metricas.tempo_medio_us << " microssegundos" << '\n';

    return 0;
}

Arquivo 3: CMakeLists.txt (Configuração Canônica C++20 Targets)

cmake_minimum_required(VERSION 3.28)
project(EngineTelemetryApp LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Declaração do executável com Módulos C++20
add_executable(app_modulos main.cpp)

# Registro da unidade de interface de módulo (C++20 File Sets)
target_sources(app_modulos
    PUBLIC
        FILE_SET cxx_modules TYPE CXX_MODULES FILES
            engine.ixx
)

# Flags de alerta estrito
target_compile_options(app_modulos PRIVATE
    $<$<CXX_COMPILER_ID:MSVC>:/W4 /permissive->
    $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra -Wpedantic>
)

2. Instruções de Compilação e Execução

# Geração de build e compilação via CMake Moderno
cmake -B build -S .
cmake --build build --config Release

# Execução do binário compilado
./build/app_modulos   # Linux / macOS
.\build\Release\app_modulos.exe  # Windows MSVC

3. Saída Esperada no Terminal

=== CAPÍTULO 19: MÓDULOS C++20 E CMAKE MODERNO ===
[Modulo telemetry.engine] Motor 'Alpha_Gateway' inicializado via C++20 Modules!
Total Transacoes: 1500000
Latencia Media:   1.45 microssegundos