使用函数的const指针编译时间初始化

时间:2018-06-05 06:50:06

标签: c initialization const

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

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

嵌套的struct 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()
};

基本上我正在尝试做的是获取对初始化块内的struct实例的引用。由于引用本身被定义为const,并且函数返回一个const指针,编译器应该能够这样做(我正在使用带C99的GCC)。

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

1 个答案:

答案 0 :(得分:2)

这是不允许的,因为编译器非常有帮助地给你了。

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