Like i said, it's a lame one
What do i do with things that contain more complex statements like:
if(size > 0x1ff) {
size_t sz = size;
for(ndx = 0; ndx < 32; ndx++) {
if(sz <= 0) {
break;
}
sz >>= 1;
}
ndx -= 8;
ndx <<= 9;
}
else {
ndx = size;
}
Do i have to make it into a function?
You can make a macro out of that, e.g.
#defined STRANGE_MACRO( size, ndx ) \
do { \
if ( ( size ) > 0x1ff) { \
size_t sz = ( size ); \
for ( ndx = 0; ndx < 32; ndx++ ) { \
if ( sz <= 0 ) \
break; \
sz >>= 1; \
} \
ndx -= 8; \
ndx <<= 9; \
} \
else \
ndx = ( size ); \
} while ( 0 ) \
but I would rather recommend to make that a function. Macros can
easily break when not written and used very carefully. If you e.g.
call it as
STRANGE_MACRO( size++, ndx );
then 'size' gets incremented two or three times instead of just
once as you would expect from a function call because a macro i
a simple text replacement (you could avoid that here by introdu-
cing another variable in the block and assigning the value of
'size' to it just once instead of evaluating it several times
in the macro). And, of course, if you try to call it like this
STRANGE_MACRO( size, ndx + 1 );
you'll ge a syntax error that's probably very hard to find. So why
not make the whole thing into a function?
BTW, in that macro you use a shift operation on 'sz' but also test
it for being less or equal to 0. But you can only use shift operations
safely on unsigned integers.
Regards, Jens