你能根据参数选择#define吗?

时间:2017-05-30 21:43:26

标签: c directive

为了简化常见的位图查找,我决定为它编写一个宏。该宏将接受参数数组,位置和每个条目的位数。后者总是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)

然而,三位位图将更复杂,因为它将跨越字节边界。为了提高效率,我不想在我只使用一位和两位查找时包含该代码。所以我想使用排序的宏

#define BITMAPLOOKUP(array, index, k) kBITLOOKUP(array, index)

然而,这不起作用。有解决方法吗?

注意:根据多个评论者的要求,这已经更新为非最小的工作示例。

2 个答案:

答案 0 :(得分:4)

您可以使用##构造将宏参数粘贴到不带分隔符的其他单词中。所以这将有效:

#define FUNCTION(k) FUNCTION##k

Try it online!

答案 1 :(得分:2)

@MadPhysicist建议如下:

#include <stdio.h>

static void func0(void) { printf("0\n"); }
static void func1(void) { printf("1\n"); }
static void func2(void) { printf("2\n"); }
static void func3(void) { printf("3\n"); }

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 */
}