Quantcast
Channel: Active questions tagged header - Stack Overflow
Viewing all articles
Browse latest Browse all 705

How do C++ modules hide implementation details when they are in the same file as the interface?

$
0
0

I’m reading Bjarne Stroustrup’s A Tour of C++ (3rd Edition), which provides a brief introduction to C++20 features. In the book, he shows how export module can eliminate the traditional pattern of having to split declarations and definitions into separate header (.h) and source (.cpp) files. In his book, he introduces a home-brewed vector class module to explain his point:

export module Vector; // defining the module called "Vector"export class Vector {public:    Vector(int s);    double& operator[](int i);    int size();private:    double* elem; // elem points to an array of sz doubles    int sz;};export bool operator==(const Vector& v1, const Vector& v2) {    if (v1.size() != v2.size())         return false;    for (int i = 0; i < v1.size(); ++i) {        if (v1[i] != v2[i])             return false;    }    return true;}//Implementations; Supposed to be hiddenVector::Vector(int s) : elem{new double[s]}, sz{s} {}double& Vector::operator[](int i) { return elem[i]; }int Vector::size() { return sz; }

Traditionally, we had to separate header files to expose function signatures (so that consumers of our library know how to call them) and .cpp files to hide implementations. However, with modules, it looks like everything sits in the same file.

My question is: How does having export in a single module file actually hide the implementation from library users? If the implementation is in the same file as the interface, doesn’t that let users (or any consuming compiler) "see" everything by simply looking into the module file?

To put it another way, if I place everything (both the public interface and private implementation) in a single module file, how do I actually hide my private code from clients, while notifying human developers of its function signature, declaration, etc. Isn't text-based header file still needed? I’m specifically concerned about the practical distribution of a closed-source library.


Viewing all articles
Browse latest Browse all 705

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>