[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: linux/kernel.h (&_x == &_y); why
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/