Linked by Amjith Ramanujam on Fri 21st Nov 2008 03:38 UTC
General Development The Linux kernel uses several special capabilities of the GNU Compiler Collection (GCC) suite. These capabilities range from giving you shortcuts and simplifications to providing the compiler with hints for optimization. Discover some of these special GCC features and learn how to use them in the Linux kernel.
Thread beginning with comment 337967
To read all comments associated with this story, please click here.
Comment by Yamin
by Yamin on Fri 21st Nov 2008 04:58 UTC
Yamin
Member since:
2006-01-10

----------
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
-------------

anyone know what why this line is there:
void) (&_min1 == &_min2);
?

RE: Comment by Yamin
by irasnyd on Fri 21st Nov 2008 05:34 in reply to "Comment by Yamin"
irasnyd Member since:
2005-07-06

It has to do with typechecking.

Making a simple program:
int x = 10;
long y = 20;
long r = min(x, y);

Gives the following warning:
warning: comparison of distinct pointer types lacks a cast

Reply Parent Bookmark Score: 3

RE[2]: Comment by Yamin
by drahca on Fri 21st Nov 2008 13:34 in reply to "RE: Comment by Yamin"
drahca Member since:
2006-02-23

Could you please explain further. For me the line (void) (&_min1 == &_min2); is still somewhat inexplicable, since it does not seem to do anything other than compare the two pointers of the temporary variables (which are always distinct) and cast the result to void. So it seems to me as an addendum to the macro (they must have first written it without this line) to keep GCC from generating warnings. Why GCC refrains from the warning after this line is not completely clear to me.

Reply Parent Bookmark Score: 1