extern(C++, ns)

tsbockman via Digitalmars-d digitalmars-d at puremagic.com
Wed Jan 20 15:52:52 PST 2016


On Wednesday, 20 January 2016 at 20:56:49 UTC, Walter Bright 
wrote:
> On 1/20/2016 4:17 AM, Manu via Digitalmars-d wrote:
>> You claim this is a problem that must desperately be solved:
>> ------------------------------------
>> int x;
>> extern(C++, ns) int x;
>> ------------------------------------
>>
>> The solution arrives at basically the same problem:
>> ------------------------------------
>> int ns;
>> extern(C++, ns) int x;
>> ------------------------------------
>>
>> We've just robbed peter to pay paul?
>
> C++ doesn't allow:
>
>     int ns;
>     namespace ns { ... }
>
> either, so there can never be a need to solve that problem.

In Manu's example, `int ns` is a native D variable, not an 
extern(C++) one.

The C++ code you responded with has no relevance to whether 
Manu's example could or should work; it's entirely determined by 
the design of the D compiler.

More generally, the basic purpose of `extern(C++)` is simply to 
indicate that a D identifier should be mapped to a certain C++ 
symbol.

It makes no sense to insist that the D identifier *must* be 
derived from the C++ symbol in a some specific way (that is, by 
including the C++ namespace in the D identifier) to make the 
problem tractable. If you wanted to, you could easily make the 
mapping totally arbitrary with something like `pragma(mangle)`.

Given that the mapping could be anything you choose, how can D's 
identifier disambiguation facilities be adequate for native D 
symbols, and yet not for C++ symbols? Why must there be any 
difference between the two at all?


More information about the Digitalmars-d mailing list