C-您可以根据参数选择#Define吗?



为了简化通常发生的位图查找,我决定为其编写一个宏。该宏将每个条目的参数数组,位置和位数。后者始终是在编译时确定的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 */
}

最新更新