熟练用kernel提供的API,可以避免重复造车,提高编程效率.
min_t 和 max_t 用于返回两个数中的最小值和最大值,这两个数的类型必须要一致.
#define min_t(type, x, y) \
__min(type, type, \
__UNIQUE_ID(min1_), __UNIQUE_ID(min2_), \
x, y)
#define max_t(type, x, y) \
__max(type, type, \
__UNIQUE_ID(min1_), __UNIQUE_ID(min2_), \
x, y)
例如下面这段code就返回1和base >> order的最大值,且这两个值都是unsigned long
unsigned long order, base_pfn;
base_pfn = max_t(unsigned long, 1, base >> order);
而min(x, y) 和 max(x, y)会返回两个数中的最小值和最大值,但是不用传递type,会用typeof 获得类型.
#define __min(t1, t2, min1, min2, x, y) ({ \
t1 min1 = (x); \
t2 min2 = (y); \
(void) (&min1 == &min2); \
min1 < min2 ? min1 : min2; })
#define min(x, y) \
__min(typeof(x), typeof(y), \
__UNIQUE_ID(min1_), __UNIQUE_ID(min2_), \
x, y)
#define __max(t1, t2, max1, max2, x, y) ({ \
t1 max1 = (x); \
t2 max2 = (y); \
(void) (&max1 == &max2); \
max1 > max2 ? max1 : max2; })
#define max(x, y) \
__max(typeof(x), typeof(y), \
__UNIQUE_ID(max1_), __UNIQUE_ID(max2_), \
而clamp_t 用于判断db是否在3和15之内,如果比3小则返回3,比15大的返回15.在其间的话,返回自己本身
u8 pwr;
pwr = clamp_t(u8, db, 3, 15);
和下面这段code等价,可以用来简化编程
if(db <3)
return 3
elif(db>15)
return 15
else
return db
其源代码如下:
#define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)
而clamp_val 是clamp_t的简化版,省去了tyle,改用typeof(val) 获取变量类型
#define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi)
#define swap(a, b) \
do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
swap 用于交换两个变量。
min3 和 max3分别返回三个数中的最小值和最大值
#define min3(x, y, z) min((typeof(x))min(x, y), z)
#define max3(x, y, z) max((typeof(x))max(x, y), z)
min_t 和 max_t 用于返回两个数中的最小值和最大值,这两个数的类型必须要一致.
#define min_t(type, x, y) \
__min(type, type, \
__UNIQUE_ID(min1_), __UNIQUE_ID(min2_), \
x, y)
#define max_t(type, x, y) \
__max(type, type, \
__UNIQUE_ID(min1_), __UNIQUE_ID(min2_), \
x, y)
例如下面这段code就返回1和base >> order的最大值,且这两个值都是unsigned long
unsigned long order, base_pfn;
base_pfn = max_t(unsigned long, 1, base >> order);
而min(x, y) 和 max(x, y)会返回两个数中的最小值和最大值,但是不用传递type,会用typeof 获得类型.
#define __min(t1, t2, min1, min2, x, y) ({ \
t1 min1 = (x); \
t2 min2 = (y); \
(void) (&min1 == &min2); \
min1 < min2 ? min1 : min2; })
#define min(x, y) \
__min(typeof(x), typeof(y), \
__UNIQUE_ID(min1_), __UNIQUE_ID(min2_), \
x, y)
#define __max(t1, t2, max1, max2, x, y) ({ \
t1 max1 = (x); \
t2 max2 = (y); \
(void) (&max1 == &max2); \
max1 > max2 ? max1 : max2; })
#define max(x, y) \
__max(typeof(x), typeof(y), \
__UNIQUE_ID(max1_), __UNIQUE_ID(max2_), \
而clamp_t 用于判断db是否在3和15之内,如果比3小则返回3,比15大的返回15.在其间的话,返回自己本身
u8 pwr;
pwr = clamp_t(u8, db, 3, 15);
和下面这段code等价,可以用来简化编程
if(db <3)
return 3
elif(db>15)
return 15
else
return db
其源代码如下:
#define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)
而clamp_val 是clamp_t的简化版,省去了tyle,改用typeof(val) 获取变量类型
#define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi)
#define swap(a, b) \
do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
swap 用于交换两个变量。
min3 和 max3分别返回三个数中的最小值和最大值
#define min3(x, y, z) min((typeof(x))min(x, y), z)
#define max3(x, y, z) max((typeof(x))max(x, y), z)