Poul-Henning Kamp said:
>>>     #define timespecsub(vvp, uvp)                                   \
>>>             do {                                                    \
>>>                     (vvp)->tv_sec -= (uvp)->tv_sec;                 \
>>>                     (vvp)->tv_nsec -= (uvp)->tv_nsec;               \
>>>                     if ((vvp)->tv_nsec < 0) {                       \
>>>                             (vvp)->tv_sec--;                        \
>>>                             (vvp)->tv_nsec += 1000000000;           \
>>>                     }                                               \
>>>             } while (0)
>>>
>>> Lovely, isn't it ?
>> Unlovely, but not the ugliest, especially considering that there may
>> not have been a better way at the time.
>> The 'do  { ... } while (0)' kludge is at least as ugly as its contents[...]
> The do {...} while(0) is the least ugly way to make function-like CPP
> macros safe for below average programmers IMO.

For below-average programmers to write, perhaps. The obvious way for a
competent programmer to write this without that horrible hack is:

#define timespecsub(vvp, uvp)            \
    ((vvp)->tv_sec -= (uvp)->tv_sec,     \
     (vvp)->tv_nsec -= (uvp)->tv_nsec,   \
     ((vvp)->tv_nsec < 0)                \
      ? ((vvp)->tv_sec--, (vvp)->tv_nsec += 1000000000) \
      : (void) 0)

This has the advantage of being usable wherever a function can appear.

Of course, since it evaluates its arguments multiple times, the usual
convention is to put the name in uppercase.

But with a modern compiler I'd just write it as a function (possibly an
inline one) and let the compiler worry about efficiency.

-- 
Clive D.W. Feather          | If you lie to the compiler,
Email: [email protected]     | it will get its revenge.
Web: http://www.davros.org  |   - Henry Spencer
Mobile: +44 7973 377646
_______________________________________________
LEAPSECS mailing list
[email protected]
http://six.pairlist.net/mailman/listinfo/leapsecs

Reply via email to