Source file "a.h":export int x;
Translation unit #1:module; #include "a.h" / error: declaration of x is not in the / purview of a module interface unit export module M; export namespace {} / error: namespace has internal linkage namespace { export int a2; / error: export of name with internal linkage } export static int b; / error: b explicitly declared static export int f(); / OK export namespace N { } / OK export using namespace N; / OK — end example]
Source file "b.h":int f();
Importable header "c.h":int g();
Translation unit #1:export module X; export int h();
Translation unit #2:module; #include "b.h" export module M; import "c.h"; import X; export using ::f, ::g, ::h; / OK struct S; export using ::S; / error: S has module linkage namespace N { export int h(); static int h(int); / #1 } export using N::h; / error: #1 has internal linkage — end example]
Interface unit of M:export module M; export struct X { static void f(); struct Y { }; }; namespace { struct S { }; } export void f(S); / OK struct T { }; export T id(T); / OK export struct A; / A exported as incomplete export auto rootFinder(double a) { return [=](double x) { return (x + a/x)/2; }; } export const int n = 5; / OK, n has external linkage
Implementation unit of M:module M; struct A { int value; };
Main program:import M; int main() { X::f(); / OK, X is exported and definition of X is reachable X::Y y; / OK, X::Y is exported as a complete type auto f = rootFinder(2); / OK return A{45}.value; / error: A is incomplete } — end example]