extern(C++, ns)

Rikki Cattermole via Digitalmars-d digitalmars-d at puremagic.com
Sat Jan 2 21:53:46 PST 2016


On 03/01/16 6:51 PM, Manu via Digitalmars-d wrote:
> On 3 January 2016 at 15:45, Manu <turkeyman at gmail.com
> <mailto:turkeyman at gmail.com>> wrote:
>
>     On 3 January 2016 at 15:34, Rikki Cattermole via Digitalmars-d
>     <digitalmars-d at puremagic.com <mailto:digitalmars-d at puremagic.com>>
>     wrote:
>
>         On 03/01/16 6:26 PM, Manu via Digitalmars-d wrote:
>
>             On 3 January 2016 at 15:17, Rikki Cattermole via Digitalmars-d
>             <digitalmars-d at puremagic.com
>             <mailto:digitalmars-d at puremagic.com>
>             <mailto:digitalmars-d at puremagic.com
>             <mailto:digitalmars-d at puremagic.com>>> wrote:
>
>                  Ok, so what I gathered from that is that if a D
>             package/module
>                  matches a C++ one in scope, D will only be checked.
>
>
>             No, you name conflict error. But that's not the main problem
>             I'm talking
>             about, which is that namespace scopes are created and break
>             everything.
>
>                  The obvious answer would be to rename the D side, but
>             that really
>                  isn't good enough.
>
>
>             You don't just go and rename an entire existing project,
>             which is a lib
>             in this case (so, also rename all the clients...?) because
>             you need to
>             type extern(C++) somewhere :/
>
>
>         Hang on I just tried this on Windows:
>
>         module ns.m;
>
>         import x.y;
>         // import x.y : ns.Y; // doesn't work grr
>         import x.y : Y;
>
>
>         module x.y;
>
>         extern(C++, ns) {
>                  struct Y {
>                  }
>         }
>
>
>         Does this work for you?
>
>
>     The short answer is, "most of the time".
>     I've been using recursive modules to place extern(C++) declarations
>     in a sensible scope quite a lot. It breaks sometimes, not sure
>     why... suspect it's related to forward referencing, or
>     multiple/semi-circular imports.
>
>
> For instance, connecting to the C++ string lib:
>
> module libep.string;
> public import libep.c.string : BaseString, MutableString, SharedString;
> alias String = BaseString!char;
> alias WString = BaseString!wchar;
> alias DString = BaseString!dchar;
>
> Those don't like to be imported that way: Error: template instance
> BaseString!char BaseString is not a template declaration, it is a alias
> If I instead:
>
> module libep.string;
> static import libep.c.string;
> alias BaseString = libep.c.string.BaseString;
> alias MutableString = libep.c.string.MutableString;
> alias SharedString = libep.c.string.SharedString;
> alias String = BaseString!char;
> alias WString = BaseString!wchar;
> alias DString = BaseString!dchar;
>
> That works in this case. Other cases are different, eg:
>
> module libep.variant;
> public import libep.c.variant : Variant;
>
> That one works.

Can you please come on IRC?
It will be a little easier to solve this.


More information about the Digitalmars-d mailing list