downs wrote:
I've just committed a module to tools (tools.cpp, 
http://dsource.org/projects/scrapple/Trunk/tools/tools/cpp.d ) that should 
enable linking and using any C++ library with D programs without creating a C 
wrapper for it.

The code has been tested with a simple multiple-inheritance sample: 
http://paste.dprogramming.com/dpv8hpjp

The D code to bind to this is http://paste.dprogramming.com/dphlv1ot . It 
requires a symlink to the tools folder in its directory.

Caveats:

 - D1
 - Only works on g++4's "newapi" layout and mangling (but should be reasonably 
portable).

At http://www.agner.org/optimize/, you can find a document (calling_conventions.pdf) which gives full details of the C++ name mangling schemes for various compilers.

Writing this also gave us what I believe to be a fair contender to Most 
Horrifying Statement of D Ever Written:

  fndefs ~= `mixin("extern(C) `~t~` "~`~mname~`~"`~fnparams~`; ");`~'\n'~
      `mixin("`~fn~`("~refToParamList("Params!(typeof(&"~`~mname~`~"))", 
isRef!(typeof(mixin("&"~`~mname~`))))~") {
      return 
"~`~mname~`~"("~refToValueList(isRef!(typeof(mixin("&"~`~mname~`))))~");
    }
  "); `;

Ugh, that's unreadable.

I found that with a little function called string enquote(string s), which changes s into "s", this kind of stuff looks much less terrible.
In particular you get rid of the nasty mix of ` and ".

fndefs ~= "mixin(" ~ enquote("extern(C)" ~ t ~ " ")
                   ~ "~" ~ mname
                   ~ "~" ~ enquote(fnparams ~ ";")
             ~ ");"
        ~ "mixin(" ~ ....

// etc

Reply via email to