On 1/2/2016 8:54 PM, Manu via Digitalmars-d wrote:
C++ namespacing is causing me endless, and I mean *endless* trouble.
This idea that we express the C++ namespace hierarchy in D is the main problem.
I don't think C++ namespaces should interfere with D scoping rules, they should
be purely for mangling.
It creates a whole bundle of edge cases which either don't have work arounds, or
REALLY awkward workarounds which typically have a heavy impact on all the
regular D code that the C++ code interacts with.

Not least of which is that C++ namespaces usually span the entire project, and
in D a C++ namespace can only appear in one module ever.
Declaring symbols with the same C++ namespace in different modules leads to
multiple definition errors, and if you are super-careful to avoid those, you
gain name resolution issues in it's place.

That works the same as in C++. Don't define the same symbol in the same C++ namespace in multiple modules. It doesn't work in C++, and doesn't work in D for exactly the same reason.


It is also very awkward that a C++ namespace can't be the same as a top level
package name. My top level package is named the same as one of my C++
namespaces... what do I do? It gets ugly real fast.

The main problem extends from this situation:

module x.y;

extern(C++, ns) struct Y {}


module ns.m;

import x.y; // fail, the c++ namespace is already present (top level module)

Doesn't fail when I try it.

import x.y : ns.Y; // fail, '.' can't appear here

Right, this syntax only works for module scope declarations. Y is not module 
scope.

You can do:

    import x.y : ns;

import x.y : Y; // fail, not found

Again, Y is not module scope.

// This **sometimes** works,

sometimes?

and it's very brittle

??

static import x.y;
alias Y = x.y.Y;

Nothing wrong with that.

Thing is, I'm not declaring a C++ object, I'm declaring a D object,  the only
thing being that struct's take care to maintain common binary layout, and
functions just mangle like C++ so that my code links. I'm in D, I'm declaring my
stuff in the D module where it should be scoped, and where other D code should
expect to find it. I don't see any point in building the C++ hierarchy in this
space. C++ namespace rules are incompatible with D; you can litter them through
C++ code, and add new symbols to C++ namespaces from anywhere...

You can do that in D as well, as long as you follow the One Definition Rule, which you have to with C++ code anyway.

this is
fundamentally incompatible with D, and no further reasoning should be required
to conclude that it can't be reproduced, so it should be for mangling purposes 
only.

I guarantee you that if we'd implemented it that way, you'd have a long litany of complaints about that, because the compiler could not distinguish Y from ns.Y.

I have spent **days**, actually, weeks of my free time trying to make my tiny
bit of code build, and it's just nothing but trouble after trouble. I have
completely restructured my code at least 3 times to try and find a way to make
it fit together in a way that's both practical and works, but I just can't. It
always hits some brick wall somewhere.

extern(C++, NS) looks okay in isolated tests/experiments, but try and actually
use it, and you will become very frustrated.

Please, fix this. I'm almost done. I'm really struggling to keep this dream 
alive.

I do not understand what difficulty you are having with this.

Reply via email to