Question about version ( ) keyword

Daniel Kozak via Digitalmars-d digitalmars-d at puremagic.com
Mon Mar 21 13:36:13 PDT 2016



Dne 21.3.2016 v 15:51 Vincent R via Digitalmars-d napsal(a):
> Hi,
>
> When looking at core definitions like core.sys.posix.pthread I can see 
> some "duplicated" code because it seems version doesn't support Or as 
> we would do in C/C++ with #ifdefined.
> For instance if can read this:
>
> version( CRuntime_Glibc )
> {
>     enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
>
>     int pthread_barrier_destroy(pthread_barrier_t*);
>     int pthread_barrier_init(pthread_barrier_t*, in 
> pthread_barrierattr_t*, uint);
>     int pthread_barrier_wait(pthread_barrier_t*);
>     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
>     int pthread_barrierattr_getpshared(in pthread_barrierattr_t*, int*);
>     int pthread_barrierattr_init(pthread_barrierattr_t*);
>     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
> }
> else version( FreeBSD )
> {
>     enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
>
>     int pthread_barrier_destroy(pthread_barrier_t*);
>     int pthread_barrier_init(pthread_barrier_t*, in 
> pthread_barrierattr_t*, uint);
>     int pthread_barrier_wait(pthread_barrier_t*);
>     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
>     int pthread_barrierattr_getpshared(in pthread_barrierattr_t*, int*);
>     int pthread_barrierattr_init(pthread_barrierattr_t*);
>     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
> }
> else version (OSX)
> {
> }
> else version (Solaris)
> {
>     enum PTHREAD_BARRIER_SERIAL_THREAD = -2;
>
>     int pthread_barrier_destroy(pthread_barrier_t*);
>     int pthread_barrier_init(pthread_barrier_t*, in 
> pthread_barrierattr_t*, uint);
>     int pthread_barrier_wait(pthread_barrier_t*);
>     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
>     int pthread_barrierattr_getpshared(in pthread_barrierattr_t*, int*);
>     int pthread_barrierattr_init(pthread_barrierattr_t*);
>     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
> }
> else version (CRuntime_Bionic)
> {
> }
> else
> {
>     static assert(false, "Unsupported platform");
> }
>
> When I see this code I cannot help thinking of something like:
>
> version( CRuntime_Glibc ) || version( FreeBSD ) || version (Solaris)
> {
>     if(version(Solaris))
>        enum PTHREAD_BARRIER_SERIAL_THREAD = -2;
>     else
>        enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
>
>     int pthread_barrier_destroy(pthread_barrier_t*);
>     int pthread_barrier_init(pthread_barrier_t*, in 
> pthread_barrierattr_t*, uint);
>     int pthread_barrier_wait(pthread_barrier_t*);
>     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
>     int pthread_barrierattr_getpshared(in pthread_barrierattr_t*, int*);
>     int pthread_barrierattr_init(pthread_barrierattr_t*);
>     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
> }
> else version (OSX) ||version (CRuntime_Bionic)
> {
> }
> else
> {
>     static assert(false, "Unsupported platform");
> }
>
> I suppose language creators had good reasons to not allow it but I am 
> a bit disapointed by the aspect of this language because some files 
> are really verbose.
> However I understand that this limitation allow a clear separation 
> between different platforms...
It is already has been sad why this does not work. But you can still do 
something like this (or maybe even something better(shorter)):

version(CRuntime_Glibc)
{
     enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
     version = WhatEver1;
}
else version(FreeBSD)
{
     enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
     version = WhatEver1;
}
else version (OSX)
{
     version = WhatEver2;
}
else version (Solaris)
{
     enum PTHREAD_BARRIER_SERIAL_THREAD = -2;
     version = WhatEver1;
}
else version (CRuntime_Bionic)
{
     version = WhatEver2;
}
version (WhatEver1)
{
     int pthread_barrier_destroy(pthread_barrier_t*);
     int pthread_barrier_init(pthread_barrier_t*, in 
pthread_barrierattr_t*, uint);
     int pthread_barrier_wait(pthread_barrier_t*);
     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
     int pthread_barrierattr_getpshared(in pthread_barrierattr_t*, int*);
     int pthread_barrierattr_init(pthread_barrierattr_t*);
     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
}
else version (WhatEver2)
else
{
     static assert(false, "Unsupported platform");
}


But to be fair I still prefer original code because it is obvious, which 
platform support what :)


More information about the Digitalmars-d mailing list