View source code
Display the source code in dmd/nspace.d from which this page was generated on github.
Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using local clone.

Module dmd.nspace

A scoped C++ namespace symbol

D supports the following syntax to declare symbol(s) as being part of a C++ namespace:

extern (C++, "myNamespace") { /+ Symbols +/ }       // String variant
extern (C++, SomeNamespace) { /+ Other symbols +/ } // Identifier variant

The first form is an attribute and only affects mangling, and is implemented in dmd.attrib. The second form introduces a named scope and allows symbols to be refered to with or without the namespace name, much like a named template mixin, and is implemented in this module.

extern (C++, Basket)
    struct StrawBerry;
    void swapFood (Strawberry* f1, Strawberry* f2);
void main ()
    Basket.StrawBerry fruit1;
    StrawBerry fruit2;
    Basket.swapFood(fruit1, fruit2);
    swapFood(fruit1, fruit2);

Hence the Nspace symbol implements the usual ScopeDsymbol semantics.

Note that it implies extern(C++) so it cannot be used as a generic named scope. Additionally, Nspace with the same Identifier can be defined in different module (as C++ allows a namespace to be spread accross translation units), but symbols in it should be considered part of the same scope. Lastly, not all possible C++ namespace names are valid D identifier.

See Also






Walter Bright


Boost License 1.0