#ifndef INCLUDED_C_MACROS_H #define INCLUDED_C_MACROS_H #ifndef INCLUDED_MATH_H #define INCLUDED_MATH_H #include #endif /*INCLUDED_MATH_H*/ #ifndef INCLUDED_C_TYPES_H #include #endif /*INCLUDED_C_TYPES_H*/ /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_MIN(a, b) ((a) < (b) ? (a) : (b)) #define C_MAX(a, b) ((a) > (b) ? (a) : (b)) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_RAD2DEG(x) ((x)/M_PI*180.0) #define C_DEG2RAD(x) ((x)*M_PI/180.0) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_ALIGN_UPB(x, align) (((x) + ((align) - 1)) & ~((align) - 1)) #define C_ALIGN_UP(x, align) ((((x) + ((align) - 1)) / (align)) * (align)) #define C_ALIGN_DOWNB(x, align) ((x) & ~((align) - 1)) #define C_ALIGN_DOWN(x, align) (((x) / (align)) * (align)) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_CLIP(x, min, max) (((x) < (min)) ? (min) : \ (((x) > (max)) ? (max) : (x))) #define C_MAX_CLIP(x, max) (((x) > (max)) ? (max) : (x)) #define C_MIN_CLIP(x, min) (((x) < (min)) ? (min) : (x)) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_ABS(x) (((x) < 0) ? -(x) : (x)) #define C_DIFF(a,b) C_ABS((a)-(b)) #define C_IS_NAN(x) ((x) != (x)) #define C_COMPARE(x, y) (((x) > (y)) - ((x) < (y))) #define C_SIGN(x) C_COMPARE(x, 0) #define C_IS_ODD( num ) ((num) & 1) #define C_IS_EVEN( num ) (!IS_ODD( (num) )) #define C_IS_BETWEEN(n,L,H) ((unsigned char)((n) >= (L) && (n) <= (H))) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_BIT(x) (1<<(x)) #define C_BIT_SET(x,p) ((x)|(1<<(p))) #define C_BIT_CLEAR(x,p) ((x)&(~(1<<(p)))) #define C_BIT_GET(x,p) (((x)>>(p))&1) #define C_BIT_TOGGLE(x,p) ((x)^(1<<(p))) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define C_SET(d, n, v) do{ c_size_t i_, n_; \ for ( n_ = (n), i_ = 0; n_ > 0; --n_, ++i_) \ (d)[i_] = (v); } while(0) #define C_ZERO(d, n) C_SET(d, n, 0) #define C_COLUMNS(S,E) ( (E) - (S) + 1 ) #define C_IS_ARRAY(a) ((void *)&a == (void *)a) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_STMT( stuff ) do { stuff } while (0) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ // 1. 底层拼接宏(真正执行拼接) #define C_UNIQUE_NAME_CONCAT(a, b) a ## b // 2. 中间转换宏(强制将 __LINE__ 或 __COUNTER__ 展开为实际的数字/符号) #define C_UNIQUE_NAME_EVAL(a, b) C_UNIQUE_NAME_CONCAT(a, b) // 3. 面向用户的唯一名称生成宏 #if defined(__COUNTER__) // 工业级推荐:__COUNTER__ 从 0 开始,每次调用自动递增,保证绝对唯一 #define C_UNIQUE_NAME(prefix) C_UNIQUE_NAME_EVAL(prefix, __COUNTER__) #else // 兼容标准:__LINE__ 使用当前行号,同一行内多次调用可能会冲突 #define C_UNIQUE_NAME(prefix) C_UNIQUE_NAME_EVAL(prefix, __LINE__) #endif /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_ONCE2(stmts, var) {static int var = 1;\ if(var){stmts\ var = 0;}} #define C_ONCE(stmts) C_ONCE2(stmts, C_UNIQUE_NAME(__onceVar__)) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_CONTAINER_OF(ptr, type, member) \ ((type *)( (char *)(ptr) - offsetof(type, member) )) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define C_UNUSED(x) ((void)(x)) #endif /*INCLUDED_C_MACROS_H*/