link to C++ function in a namespace whose name is a D keyword

Jacob Carlborg via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jan 6 11:55:56 PST 2016


On 2016-01-06 19:35, Carl Sturtivant wrote:
> Hello,
>
>  From D I want to call e.g.
>
> /* C++ prototype */
> namespace ns {
>      int try(int x);
> }
>
> without writing a C or C++ wrapper.
>
> Presumably the following D doesn't work, because it doesn't mangle the
> name as if it's in the namespace ns.
>
> pragma(mangle, "try") extern(C++, ns) int try_(int x);
>
> So how to I get correct mangling here?
>

A really ugly workaround is:

1. Declare a extern(C++) function in the "ns" namespace with the same 
length as the name you want, "foo" for example

extern (C++, ns)
{
     int foo(int x);
}

2. Print the mangling of the function

pragma(msg, foo.mangleof); // __ZN2ns3fooEi on OS X

3. Replace "foo" with the name you actually want, "try" in this case

__ZN2ns3fooEi -> __ZN2ns3tryEi

4. Use pragma(mangle) to set the mangled name

pragma(mangle, "__ZN2ns3tryEi") extern (C++) int try_(int x);

-- 
/Jacob Carlborg


More information about the Digitalmars-d-learn mailing list