include/linux/kernel.h
(void) (&_x == &_y)
------------------------------------------------------ #include <stdio.h>/* 使用该宏时,如果不关心返回值,没有圆括号()也可以,但是{}是必须的 */ #define min(x, y) { \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; } int main () { min(10, 20); if (1) min(10, 20); return 0; } ------------------------------------------------------ #include <stdio.h> /* * 用该宏时,如果关心返回值,就必须要圆括号() * 最后一句是该宏的返回值 */ #define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; } ) int main () { int ret; ret = min(10, 20); printf("ret = %d\n", ret); return 0; } ------------------------------------------------------ #include <stdio.h> /* * 检测变量类型是否相同 * (void) (&_min1 == &_min2); */ #define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; }) int main () { int ret; int i; char j; ret = min(i, j); printf("ret = %d\n", ret); return 0; } ------------------------------------------------------ #include <stdio.h> /* * 防止类似i++类型的参数,被重复计算 * typeof(x) _min1 = (x); */ #define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; }) int main () { int ret; int i = 100; int j = 200; ret = min( i++, j++); printf("ret = %d\n", ret); return 0; }
------------------------------------------------------
------------------------------------------------------ |
【转】 从一个简单的宏定义看linux内核的严谨,窥C语言的强大(ZZ)
最新推荐文章于 2019-07-10 16:33:20 发布