DIP61: redone to do extern(C++,N) syntax
via Digitalmars-d
digitalmars-d at puremagic.com
Mon Apr 28 04:29:01 PDT 2014
On Monday, 28 April 2014 at 07:45:20 UTC, Temtaime wrote:
> I think he meant next:
>
> A.d:
> void foo();
>
> A.cpp:
> namespace A { void foo(); }
>
> And now we has:
>
> exnern(C++, A) void foo();
> import A;
>
> void main() {
> A.foo(); // which foo will be called ? how to call d version or
> c++ ?
> }
This is close. Forgive inaccurate syntax, but I see at least
these issues that will make namespaces/module-system broken in
terms of maintenance:
YEAR 2014:
framework1.d:
extern (C++, std){ void something(); }
framework2.d:
extern (C++,std){void something(); void anything();}
application.d:
import framework1;
import framework2;
… std.something(); // is this ok, because the extern signatures
match?
---------
YEAR 2015:
std.d is updated:
void something(){}
void coolstuff(){}
application.d is updated to use the new coolstuff():
import framework1;
import framework2;
import.std();
… std.something(); // namespace encapsulation broken or fail?
… std.coolstuff();
application.d is corrected to (or using some other resolution):
import framework1;
import framework2;
import.std();
… framework2.std.something();
… std.coolstuff();
---
YEAR 2016:
framework2.d is modified:
extern (C++,std){ void anything(); }
application.d is recompiled unmodified:
import framework1;
import framework2;
import.std();
// fails even though the signature is still in framework1
… framework2.std.something();
… std.coolstuff();
> There's no linker problem because D and C++ has different name
> mangling.
Right, but I want to be sure that the type-system sees all
externs with the same signature as the same type. I also am not
sure how the "closing of namespaces" will work if you have
multiple frameworks that independently specify their own C++
bindings to the same library.
The sole purpose of namespace/modules is to have clean separation
between frameworks and support evolutionary development. I am not
convinced that this property is not broken with the proposed
change.
To get around this you will have to remove the "closing of
namespaces" restriction and add a root "cpp" so that all cpp
namespaces get: cpp.std.something() etc…
More information about the Digitalmars-d
mailing list