Introduction

Modules are a new feature in C++20 that allow you to group related code together into a single unit. This can make your code more modular and easier to understand. Modules are also more efficient than traditional header files, because they only need to be compiled once, even if they are used by multiple source files.

In this article, we will discuss the following topics:

  • What are modules in C++?
  • How to use modules in C++
  • Compilation steps with g++
  • Examples of using modules
  • Conclusion

What are modules in C++?

Modules are a new feature in C++20 that allow you to group related code together into a single unit. This can make your code more modular and easier to understand. Modules are also more efficient than traditional header files, because they only need to be compiled once, even if they are used by multiple source files.

A module is a self-contained unit of code that can be imported into other source files. A module can contain functions, classes, variables, and other declarations. Modules are also namespace-aware, which means that you can use the import keyword to import a module and its namespace into your code.

How to use modules in C++

To use modules in C++, you need to add the module keyword to the beginning of your source file. You also need to specify the name of the module, which is the same as the filename. For example, the following code defines a module called math:

Code snippet

// math.cpp
export module math;
export int add(int x, int y){
    return x + y;
}
export namespace math {  // this function will be called with namespace
    auto sub(auto x, auto y) -> decltype(x-y) {
        return x - y;  
    }   
}
void print() {} // this function will not be exported

The module keyword tells the compiler that this is a module file. The export keyword tells the compiler that the function or namespace is to be exported from the module. The import keyword tells the compiler that this file imports a module.

Once you have defined a module, you can use it in other source files by importing the module. For example, the following code imports the math module and then calls the add() function:

Code snippet

// main.cpp
import <iostream>;
import math;
int main() {
    std::cout << "3+6 = " <<  add(3,6) << "\n";
    std::cout << "6-2 = " << math::sub(6,2) << "\n";
}

The import keyword tells the compiler that this file imports the math module. The add() function is exported from the math module, so it can be called without any namespace qualification. The sub() function is also exported from the math module, but it is in a namespace, so it must be called with the math:: namespace qualification.

Compilation steps with g++

To compile and run the code in this article, you would use the following commands:

Compilation Commands

g++ -std=c++20 -fmodules-ts -xc++-system-header iostream
g++ -std=c++20 -fmodules-ts -c math.cpp
g++ -std=c++20 -fmodules-ts -c main.cpp
g++ -std=c++20 main.o math.o -o main

The -std=c++20 flag tells GCC to compile the code using the C++20 standard. The -fmodules-ts flag tells GCC to compile the code as modules. The -xc++-system-header iostream flag tells GCC to compile the iostream header file as a system header.

The main.o and math.o files are the object files that are generated by compiling the main.cpp and math.cpp files, respectively. The -o main flag tells GCC to create an executable file called main from the main.o and math.o files.

Output

./main

3+6 = 9
6-2 = 4

Examples of using modules

Here are some examples of how you can use modules in C++:

  • You can use modules to organize your code into logical units.
  • You can use modules to share code between different

Conclusion

Modules are a powerful new feature in C++ that can make your code more modular and efficient. If you are new to modules, I encourage you to check out the C++ Modules tutorial: https://en.cppreference.com/w/cpp/language/modules for more information.