为了简化通常发生的位图查找,我决定为其编写一个宏。该宏将每个条目的参数数组,位置和位数。后者始终是在编译时确定的1、2或3。
每个条目的一个和两个位的宏非常简单:
#define 1BITLOOKUP(array, index) (array[index / CHAR_BIT] >> (index % CHAR_BIT)) & 1
#define 2BITLOOKUP(array, index) (array[2 * index / CHAR_BIT] >> (2 * index % CHAR_BIT)) & (0x11)
但是,三位位图将更加复杂,因为它会跨越字节边界。为了提高效率,我不希望在只使用一单位和两位查找时包括该代码。因此,我想使用sort
的宏#define BITMAPLOOKUP(array, index, k) kBITLOOKUP(array, index)
但是,这行不通。有解决方法吗?
注意:根据多个评论者的要求,已将其更新为非最小工作示例。
您可以使用##
构造将宏参数粘贴到没有分离器的其他单词中。因此,这将有效:
#define FUNCTION(k) FUNCTION##k
在线尝试!
@madphysicist建议:
#include <stdio.h>
static void func0(void) { printf("0n"); }
static void func1(void) { printf("1n"); }
static void func2(void) { printf("2n"); }
static void func3(void) { printf("3n"); }
static void (*func[])(void) = {func0, func1, func2, func3};
int main(void)
{
func[1]();
return 0;
}
这有一个优势:您不仅限于编译时间文字:
for (int i = 0; i < 3; i++) {
FUNCTION(i); /* invalid */
func[i](); /* valid */
}