【发布时间】:2022-12-09 10:31:45
【问题描述】:
我正在 2 个驱动程序之间制作查找表。我使用一个从索引 0 开始的枚举,它被传递到一个查找表以返回一个整数。这很好用。
// In library
#define LIB_FEATURE_1 0x10
#define LIB_FEATURE_2 0x22
#define LIB_FEATURE_3 0x44
#define LIB_FEATURE_4 0x42
// In my costum driver
enum features_s {
my_feature_a = 0,
my_feature_b = 1,
my_feature_c = 2
};
const int feature_tbl[] = {
LIB_FEATURE_2, // Maps my_feature_a to LIB_FEATURE_2
0xFF, // Maps my_feature_b to an error code because this
// feature is not present in library
LIB_FEATURE_4 // Maps my_feature_c to LIB_FEATURE_4
};
// In app
int value = feature_tbl[my_feature_a];
该库包含一些更复杂的宏(在嵌入式系统中设置寄存器):
// In library
#define LIB_FEATURE_1 do {
//does black magic
} while(0)
#define LIB_FEATURE_2 do {
//does white magic
} while(0)
#define LIB_FEATURE_3 do {
//does yellow magic
} while(0)
#define LIB_FEATURE_4 do {
//does purple magic
} while(0)
// In my costum driver
enum features_s {
my_feature_a = 0,
my_feature_b = 1,
my_feature_c = 2
};
/*
* something missing here. I want this mapping :
* my_feature_a executes LIB_FEATURE_2();
* my_feature_b executes nothing
* my_feature_c executes LIB_FEATURE_4();
*/
// In app
SOME_KIND_OF_LOOK_UP_TABLE[my_feature_a]();
是否可以创建一个 const 表,或者一个将索引作为参数并执行正确功能的宏?
我也试过宏连接,但它似乎不起作用。
我尝试使用常量表和宏连接
【问题讨论】:
-
宏是编译前的文本替换。它们在运行时不作为自己的实体存在。您可能会考虑使用函数指针数组。函数体将是您的宏现在的样子。另一种选择是编写一个函数(或大型宏),它有一个开关,不同的情况下调用不同的宏。
标签: c macros lookup-tables