Am Fri, 14 Mar 2014 10:53:59 -0700
schrieb Walter Bright <newshou...@digitalmars.com>:

> On 3/14/2014 10:26 AM, Johannes Pfau wrote:
> > I use manifest constants instead of version identifiers as well. If
> > a version identifier affects the public API/ABI of a library, then
> > the library and all code using the library always have to be
> > compiled with the same version switches(inlining and templates make
> > this an even bigger problem). This is not only inconvenient, it's
> > also easy to think of examples where the problem will only show up
> > as crashes at runtime. The only reason why that's not an issue in
> > phobos/druntime is that we only use compiler defined versions
> > there, but user defined versions are almost unusable.
> 
> Use this method:
> 
> 
>      --------
>      import wackyfunctionality;
>      ...
>      WackyFunction();
>      --------
>      module wackyfunctionality;
> 
>      void WackyFunction() {
>          version (Linux)
>            SomeWackyFunction();
>          else version (OSX)
>              SomeWackyFunction();
>          else
>              ... workaround ...
>      }
>      --------

I meant really 'custom versions', not OS-related. For example cairoD
wraps the cairo C library. cairo can be compiled without or with PNG
support. Historically cairoD used version(CAIRO_HAS_PNG_SUPPORT) for
this.

Then in cairo.d
version(CAIRO_HAS_PNG_SUPPORT)
{
   extern(C) int cairo_save_png(char* x);
   void savePNG(string x){cairo_save_png(toStringz(x))};
}

now I have to use version=CAIRO_HAS_PNG_SUPPORT when compiling cairoD,
but every user of cairoD also has to use version=CAIRO_HAS_PNG_SUPPORT
or the compiler will hide the savePNG functions. There are also
examples where not using the same version= switches causes runtime
crashes.

Compiler defined version(linux, OSX) are explicitly not affected by
this issue as they are always defined by the compiler for all modules.

Reply via email to