CodeNebula
C++20coreadvanced

Import/Export Declarations (C++20 Addition)

C++20 · The Big Four · Compiler flag: -std=c++20

Explanation

`import` and `export` manage module dependencies and interfaces.

Real-World Scenario

Import a utility module in a game engine’s core.

Quick Snippet

snippet.cpp
import math; int x = add(1, 2);

Full Example

import_export.cpp
// CodeNebula - C++20 Example: Import/Export Declarations
// Compile: g++ -std=c++20 -Wall -Wextra -o example import_export.cpp
//
// NOTE: Full module import/export requires compiler-specific build steps.
// This file documents the syntax and semantics, with a compilable fallback.
//
// === C++20 Module Import/Export Syntax ===
//
// --- Module interface unit (geometry.cppm) ---
//   export module geometry;              // declares this as module "geometry"
//
//   // Export individual declarations
//   export struct Point { double x, y; };
//
//   export double distance(Point a, Point b);
//
//   // Export a block of declarations
//   export {
//       struct Circle {
//           Point center;
//           double radius;
//       };
//       double area(const Circle& c);
//       double circumference(const Circle& c);
//   }
//
//   // Non-exported (module-private) helper
//   double square(double x) { return x * x; }  // not visible to importers
//
// --- Module implementation unit (geometry_impl.cpp) ---
//   module geometry;                     // implements module "geometry"
//   import <cmath>;                      // import a header unit
//
//   double distance(Point a, Point b) {
//       return std::sqrt(square(a.x - b.x) + square(a.y - b.y));
//   }
//
// --- Consumer (main.cpp) ---
//   import geometry;                     // import the module
//   import <iostream>;                   // import header unit

#include <iostream>
#include <cmath>

// Compilable fallback simulating module structure
namespace geometry {
    struct Point { double x, y; };

    // Private to the "module" — not exported
    namespace detail {
        double square(double v) { return v * v; }
    }

    // Exported declarations
    double distance(Point a, Point b) {
        return std::sqrt(detail::square(a.x - b.x) + detail::square(a.y - b.y));
    }

    struct Circle {
        Point center;
        double radius;
    };

    double area(const Circle& c) {
        return 3.14159265358979 * c.radius * c.radius;
    }

    double circumference(const Circle& c) {
        return 2.0 * 3.14159265358979 * c.radius;
    }
}

int main() {
    using namespace geometry;

    std::cout << "=== C++20 Import/Export (simulated) ===\n\n";

    Point a{0.0, 0.0}, b{3.0, 4.0};
    std::cout << "distance({0,0}, {3,4}) = " << distance(a, b) << "\n";

    Circle c{{1.0, 2.0}, 5.0};
    std::cout << "Circle at (1,2) r=5:\n";
    std::cout << "  area          = " << area(c) << "\n";
    std::cout << "  circumference = " << circumference(c) << "\n";

    std::cout << "\nImport/Export key points:\n";
    std::cout << "  - 'export module X;' declares a module interface\n";
    std::cout << "  - 'module X;' declares an implementation unit\n";
    std::cout << "  - 'import X;' brings in exported names\n";
    std::cout << "  - 'import <header>;' imports a header unit\n";
    std::cout << "  - Non-exported names stay module-private\n";

    return 0;
}

// Expected output:
// === C++20 Import/Export (simulated) ===
//
// distance({0,0}, {3,4}) = 5
// Circle at (1,2) r=5:
//   area          = 78.5398
//   circumference = 31.4159
//
// Import/Export key points:
//   - 'export module X;' declares a module interface
//   - 'module X;' declares an implementation unit
//   - 'import X;' brings in exported names
//   - 'import <header>;' imports a header unit
//   - Non-exported names stay module-private
Run command
g++ -std=c++20 -Wall -Wextra -o example import_export.cpp