从常量查找中初始化常量 table
Initializing constant from constant lookup table
我一直在查找table
static const uint32_t lut [] = {0, 20, 100, 350, 560};
我有一个结构
typedef struct {
uint32_t value;
const char * name;
} strct_t;
我想创建该结构的 global 常量实例
const struct_t def_myname = {
.value = lut[DEF_MYNAME_ID],
.name = "myname",
};
但是我需要在其他地方定义DEF_MYNAME_ID
,所以我在一些头文件中有这个
#define DEF_MYNAME_ID 3
无法编译,因为这个错误initializer element is not constant
Whosebug 中有多个问题询问如何处理 initializer element is not constant
,但 none 满足了我的需求。
有没有办法做到这一点?例如定义 lut
为宏?我在其他地方不需要它。
有没有像
#define LUT(a) ...
使用 const 初始值设定项?
我认为你很不走运,至少对于纯 C 来说是这样,因为即使是以下内容也不会编译为静态初始化程序:
int v = ((uint32_t[]) { 10, 20, 30, 40, 50 })[3];
FWIW,这样就好了:
static const uint32_t *pv = lut + DEF_MYNAME_ID;
就像这样(本质上是一样的):
static const uint32_t *pv = &(lut[DEF_MYNAME_ID]);
此外,在 C++ 中,您的整个案例都没有问题。
当然,宏可以做到这一点。
这实际上是一个更安全的代码,如果你选择一个超出范围的索引,它不会编译。
首先我们定义字典
#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",
};
我一直在查找table
static const uint32_t lut [] = {0, 20, 100, 350, 560};
我有一个结构
typedef struct {
uint32_t value;
const char * name;
} strct_t;
我想创建该结构的 global 常量实例
const struct_t def_myname = {
.value = lut[DEF_MYNAME_ID],
.name = "myname",
};
但是我需要在其他地方定义DEF_MYNAME_ID
,所以我在一些头文件中有这个
#define DEF_MYNAME_ID 3
无法编译,因为这个错误initializer element is not constant
Whosebug 中有多个问题询问如何处理 initializer element is not constant
,但 none 满足了我的需求。
有没有办法做到这一点?例如定义 lut
为宏?我在其他地方不需要它。
有没有像
#define LUT(a) ...
使用 const 初始值设定项?
我认为你很不走运,至少对于纯 C 来说是这样,因为即使是以下内容也不会编译为静态初始化程序:
int v = ((uint32_t[]) { 10, 20, 30, 40, 50 })[3];
FWIW,这样就好了:
static const uint32_t *pv = lut + DEF_MYNAME_ID;
就像这样(本质上是一样的):
static const uint32_t *pv = &(lut[DEF_MYNAME_ID]);
此外,在 C++ 中,您的整个案例都没有问题。
当然,宏可以做到这一点。 这实际上是一个更安全的代码,如果你选择一个超出范围的索引,它不会编译。
首先我们定义字典
#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",
};