c - 从常量查找表初始化常量

标签 c constants initializer

我有一个常量查找表

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/

相关文章:

javascript - 外部接口(interface)错误

c - 它在不是 16 位的机器上有效吗

c++ - 在一个 Linux 发行版上使用 g++ 编译的可执行文件在另一个发行版上使用是否有限制?

c - 为什么这些变量明显改变了类型?

constants - D:为什么 opIndex 在 std.container.Array 类中不是 const 限定的?

Java字符数组初始化器

c - 使用 O_CREAT|O_RDWR 打开文件将导致文件为只写

c# - 集中显示应用程序名称

c++ - 基类构造之后发生数据成员初始化的解决方法

ios - super.init 的 Circle Layer 错误 - Swift