你能根据参数选择#define吗?
Can you choose #define based on parameter?
为了简化常见的位图查找,我决定为其编写一个宏。该宏将接收参数数组、位置和每个条目的位数。后者始终为 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("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 */
}
为了简化常见的位图查找,我决定为其编写一个宏。该宏将接收参数数组、位置和每个条目的位数。后者始终为 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("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 */
}