[LEAPSECS] Lets get REAL about time.
    Clive D.W. Feather 
    clive at davros.org
       
    Sun Jan 22 10:42:16 EST 2012
    
    
  
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: clive at davros.org     | it will get its revenge.
Web: http://www.davros.org  |   - Henry Spencer
Mobile: +44 7973 377646
    
    
More information about the LEAPSECS
mailing list