我有一个像这样定义的结构:
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)。
现在的问题是:这是不允许的,还是我做错了哪些不允许这样做。我从编译器得到的确切错误消息是“初始化元素不是常量”。
答案 0 :(得分:2)
这是不允许的,因为编译器非常有帮助地给你了。
将与初始化相对应的运行时操作视为可执行文件中的memcpy()
,并进入流程中的某个位置。堆;这就是你所得到的一切。一堆位被设置为预定义的模式,没有函数被调用。