我有一个常量查找表
static const uint32_t lut [] = {0, 20, 100, 350, 560};
我有一个结构
typedef struct {
uint32_t value;
const char * name;
} strct_t;
我想创建该结构的全局常量实例
const struct_t def_myname = {
.value = lut[DEF_MYNAME_ID],
.name = "myname",
};
但我需要在其他地方定义DEF_MYNAME_ID
,所以我将其放在某个头文件中
#define DEF_MYNAME_ID 3
由于此错误,无法编译初始化元素不是常量
stackoverflow 中有多个问题询问如何处理 initializer element is not Constant
,但没有一个问题能满足我的需求。
有办法做到这一点吗?例如将 lut
定义为宏?我在其他地方不需要它。
有没有类似的东西
#define LUT(a) ...
usabele 作为 const 初始化器?
最佳答案
当然,宏可以做到这一点。 这实际上是一个更安全的代码,如果您选择的索引超出范围,它将无法编译。
首先我们定义我们的字典
#define _val0 0
#define _val1 20
#define _val2 100
#define _val3 350
#define _val4 560
现在我们需要一个PRIMITIVE_CAT
来强制扩展宏LUT
的参数。
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
最后是LUT
。
#define LUT(X) PRIMITIVE_CAT(_val, X)
现在是你的代码。
#define DEF_MYNAME_ID 3
const struct_t def_myname = {
.value = LUT(DEF_MYNAME_ID),
.name = "myname",
};
关于c - 从常量查找表初始化常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40946866/