I believe that it is so that gcc will throw a warning if the two types are not compatible. John On Tue, Dec 02, 2003 at 03:32:57PM -0700, Pat LaVarre wrote: > Anybody here understand the '"unnecessary" pointer comparison' of the > min/max of linux/kernel.h? > > Are we trusting gcc to disregard that sourceline? If yes then why > bother? Why not omit that sourceline? > > Pat LaVarre > > --- > > http://lwn.net/Articles/driver-porting/ > > Miscellaneous changes ... > http://lwn.net/Articles/22196/ > > ... > The min() and max() macros > > A common step in the development of most C programmers, shortly after > they learn to include stdio.h seems to be the definition of macros like: > > #define max(a,b) ((a) > (b) ? (a) : (b)) > > In 2.5, it was noted that a number of kernel developers had seemingly > not moved beyond that stage, and there was an unbelievable number of > min() and max() definitions sprinkled throughout the kernel source. > These definitions were not only redundant - they were unsafe. A max() > macro as defined above has the usual problem with side effects; it also > is not type-safe, especially when signed and unsigned values are used. > > Linus initially added his own definition of min() and max() which added > a third argument - an explicit type. That change upset people badly > enough that some put substantial amounts of time into developing > two-argument versions that are type and side-effect safe. The result now > lives in <linux/kernel.h>, and should be used in preference to any > locally-defined version. > ... > > http://lxr.linux.no/source/include/linux/kernel.h?v=2.6.0-test7#L157 > > ... > 157 /* > 158 * min()/max() macros that also do > 159 * strict type-checking.. See the > 160 * "unnecessary" pointer comparison. > 161 */ > 162 #define min(x,y) ({ \ > 163 const typeof(x) _x = (x); \ > 164 const typeof(y) _y = (y); \ > 165 (void) (&_x == &_y); \ > 166 _x < _y ? _x : _y; }) > 167 > 168 #define max(x,y) ({ \ > 169 const typeof(x) _x = (x); \ > 170 const typeof(y) _y = (y); \ > 171 (void) (&_x == &_y); \ > 172 _x > _y ? _x : _y; }) > ... > > > -- > Kernelnewbies: Help each other learn about the Linux kernel. > Archive: http://mail.nl.linux.org/kernelnewbies/ > FAQ: http://kernelnewbies.org/faq/ > -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/