首页 > 解决方案 > 使用来自函数的 const 指针进行编译时初始化

问题描述

我有一个这样定义的结构:

typedef struct {
    sn74lvc138a_options_t decoder_opts;
    uint32_t pin_int;
    uint32_t pin_rst;
    uint32_t pin_pwr;
    ...
} w5500_options_t;

嵌套结构 sn74lvc138a_options_t 结构如下所示:

static const sn74lvc138a_options_t sn74lvc138a_opts ={
    .decoder_a = DECODER_A_GPIO,
    .decoder_b = DECODER_B_GPIO,
    .decoder_c = DECODER_C_GPIO,
    .decoder_sel = DECODER_SEL_GPIO
};

这两个存储在两个不同的 C 模块中。C 模块之一(也包含 w5500_options_t 实例的模块)定义了以下函数:

static const sn74lvc138a_options_t* _get_spi_decoder(void) {
    return cpu_samv71_get_sn74lvc138a();  // This is a function from the other C module
}

我希望能够为编译时初始化执行以下操作:

static const w5500_options_t w5500_opts = {
    .pin_int = SOMEVALUE1,
    .pin_rst = SOMEVALUE2,
    .pin_pwr = SOMEVALUE3,
    .decoder_opts = _get_spi_decoder()
};

基本上我想要做的是在初始化块中获取对结构实例的引用。由于引用本身被定义为 const 并且函数返回一个 const 指针,因此编译器应该能够做到这一点(我正在使用带有 C99 的 GCC)。

现在的问题是:这是根本不允许的,还是我做错了什么,不允许这样做。我从编译器得到的确切错误消息是“初始化元素不是常量”。

标签: cinitializationconstants

解决方案


这是不允许的,因为编译器对你很有帮助。

将与初始化相对应的运行时操作视为memcpy()来自可执行文件并进入进程堆中的某个位置;这就是你所得到的。一堆位被设置为预定义的模式,没有函数被调用。


推荐阅读