In perl.perl6.internals, you wrote:
>Brent Dax <[EMAIL PROTECTED]> writes:
>
>> What about little inline things?
>
>> AUTO_OP sleep(i|ic) {
>>      #ifdef WIN32
>>              Sleep($1*1000);
>>      #else
>>              sleep($1);
>>      #endif
>> }
>
>This reminds me.  gcc is slowly switching over to writing code like that
>as:
>
>    if (WIN32) {
>        Sleep($1*1000);
>    } else {
>        sleep($1);
>    }
>
>or the equivalent thereof instead of using #ifdef.  If you make sure that
>the values are defined to be 0 or 1 rather than just defined or not
>defined, it's possible to write code like that instead.

If I recall correctly, Plan9's C compiler doesn't do #ifdef at all!
The perl5 source (#ifdef forest) was munged into the second form.

>It may not be possible to use this in cases where the not-taken branch may
>refer to functions that won't be prototyped on all platforms, depending on
>the compiler, but there are at least some places where this technique can
>be used, and it's worth watching out for.

Yes, a number of the #ifdef branches in perl5's pp_sys.c would
have this problem (odd structs present on some systems but not others,
for example).  Also the VMS code with $ signs often gives other compilers
heartburn.

>(In the case above, I'd probably instead define a sleep function on WIN32
>that calls Sleep so that the platform differences are in a separate file,
>but there are other examples of things like this that are better suited to
>other techniques.)

Yes, that's what perl5 traditionally often tried to do.  (See, for example,
the various defines in unixish.h:  fwrite1, Stat, Fstat, Fflush, Mkdir).
Of course perl5 itself hasn't even always followed that plan . . . .

-- 
    Andy Dougherty              [EMAIL PROTECTED]
    Dept. of Physics
    Lafayette College, Easton PA 18042

Reply via email to