On Friday, 7 June 2013 at 12:20:23 UTC, finalpatch wrote:
string mixins and template mixins don't work either.

On Friday, 7 June 2013 at 12:14:45 UTC, finalpatch wrote:
Hi folks,

I need to apply different calling conventions to the same interfaces when compiling for different platform. It's something like this:

OSX:

interface InterfaceA : IUnknown
{
extern(C):
   ...
}

Windows:

interface InterfaceA : IUnknown
{
   ...
}

I have to add extern(C) on OSX because apparently when the compiler sees IUnknown it automatically assumes the calling convention is extern(Windows) and in order to maintain compatibility with existing system I have to explicitly declare them as extern(C).

Now I have several dozens of interfaces like the above. I don't want to repeat them for OSX and Windows because the interface definitions are identical except the extern(C) line.

I have tried using version() like this:

interface InterfaceA : IUnknown {
   version(OSX)
   {
       extern(C):
   }
   ...methohds.
}

but it doesn't work because version limits the scope of the extern(C). static if has the same problem.

In C/C++ this is really easy, I can simply define a macro which expands to extern(C) on OSX and nothing on windows. Is there any way to achieve this in D without repeating the interface definitions?

string mixin will work

import std.stdio;
enum :string
{
     //define relevant functions in this string
     x1 =
     `void testfunc(string str)
     {
          writeln(str);
     }`
}


version(X)
{
     extern(C) mixin(x1);
     string str2 = "c version";
}

version(Y)
{
     extern(Windows) mixin(x1);
     string str2 = "windows version";
}

void main()
{
     testfunc(str2);
}

Yes it's ... well ... not very ... umm
But it works :)
extern(system) MIGHT be a better option.

Reply via email to