On Tue, Dec 02, 2003 at 15:12:52 -0800, John Tyner wrote: > I believe that it is so that gcc will throw a warning if the two types > are not compatible. Actualy, it should throw a warning if they are not exactly the same, because if they are not, the comparsion breaks aliasing rules. Especially it should throw a warning if one is signed and the other is not. > 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/ > ------------------------------------------------------------------------------- Jan 'Bulb' Hudec <bulb@ucw.cz> -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/