我有一小段代码需要读取32位整数中打包的4位值。由于我需要多次调用此操作,即使它很简单,我也需要最大速度。
我曾考虑过使用宏和内联函数,因此我制作了这个宏:
#define UI32TO4(x, p) (x >> ((p - 1) *4) & 15)
而且我有一个内联函数也能做同样的事情。
static inline Uint8 foo_getval(Uint32 bits, int pos){
return (bits >> ((pos-1)*4)) & 15;
}
考虑到操作的简便性,以及这个调用已经准备好了值(因此不可能调用错误的类型或传递过大的值等等),哪种方式最好使用?或者至少对于后来读取/修改代码的其他人来说最容易理解呢?
编辑!忘记提到,我正在使用C99。
inline
关键字只是一个建议。宏始终是“内联”的。另一方面,使用函数允许编译器进行更好的类型检查。 - Some programmer dude#define UI32TO4(x, p) ((x) >> (((p) - 1) * 4 & 15)
。例外情况是当参数作为函数的参数传递时(例如#define FUNC(x, y) otherfunc(x, y)
);当参数是表达式的一部分时,需要用括号括起来。 - Jonathan LefflerSOME_MACRO(a+b,c)
- 如果你在宏参数周围没有括号,宏代码的评估可能不会产生你所期望的结果。 - Mat