Conditional compilation

finalpatch fengli at gmail.com
Fri Jun 7 05:20:22 PDT 2013


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?



More information about the Digitalmars-d-learn mailing list