# dmd.nspace

A scoped C++ namespace symbol

#### Discussion

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

1. `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.

1. `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

https://github.com/dlang/dmd/pull/10031

#### Authors

Walter Bright

#### License

Boost License 1.0

Source: nspace.d

Documentation: https://dlang.org/phobos/dmd_nspace.html

Coverage: https://codecov.io/gh/dlang/dmd/src/master/src/dmd/nspace.d

- `Nspace`

  #### Declaration

  `class `Nspace`: dmd.dsymbol.ScopeDsymbol;`

  Ditto

  - `identExp`

    #### Declaration

    `Expression `identExp`;`

    Namespace identifier resolved during semantic.