DIP61: redone to do extern(C++,N) syntax

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Tue Apr 29 05:01:35 PDT 2014


On Mon, 28 Apr 2014 17:00:11 -0400, Simen Kjærås via Digitalmars-d  
<digitalmars-d at puremagic.com> wrote:

> On 2014-04-28 20:50, Walter Bright via Digitalmars-d wrote:
>> On 4/28/2014 7:27 AM, Steven Schveighoffer wrote:
>>> Consider this code:
>>>
>>> module foo;
>>>
>>> void func() {}
>>>
>>> module bar;
>>>
>>> extern(C) func();
>>>
>>> module prog;
>>>
>>> import foo;
>>> import bar;
>>>
>>> void main()
>>> {
>>>     func(); // error
>>>     foo.func(); // ok
>>>     bar.func(); // ok, uses C binding (no name mangling)
>>> }
>>>
>>> In this case, even though the C function is not mangled or in any other
>>> namespace, the module can be used for unambiguous calling.
>>
>> Right.
>>
>>
>>> module foo;
>>>
>>> void func() {}
>>>
>>> module bar;
>>>
>>> extern(C++, foo) void func(); // foo::func in C++ land
>>>
>>> module prog;
>>>
>>> import foo;
>>> import bar;
>>>
>>> void main()
>>> {
>>>     func(); // error
>>>     foo.func(); // ALSO error
>>
>> No, not an error. Why would it be?
>
> I believe Steven expects things to work this way:
>
> module bar;
>
> extern(C++, foo) void func();
>
>
> module prog;
>
> import bar;
>
> void main()
> {
>     foo.func(); // Calls bar.func (or is that bar.foo.func?)
> }

Yes, exactly. That is what the DIP says:

"Declarations in the namespace can be accessed without qualification in  
the enclosing scope if there is no ambiguity. Ambiguity issues can be  
resolved by adding the namespace qualifier"

Which then  proceeds to show that only the namespace qualifier is needed  
to disambiguate the symbol.

-Steve


More information about the Digitalmars-d mailing list