c - 使用来自函数的 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)。
现在的问题是:这是根本不允许的,还是我做错了什么,不允许这样做。我从编译器得到的确切错误消息是“初始化元素不是常量”。
解决方案
这是不允许的,因为编译器对你很有帮助。
将与初始化相对应的运行时操作视为memcpy()
来自可执行文件并进入进程堆中的某个位置;这就是你所得到的。一堆位被设置为预定义的模式,没有函数被调用。
推荐阅读
- javascript - 计算后为值添加逗号分隔符
- json - Flutter for Json 中的动态列表
- c# - C# - 如何使用 ListView 和 SQLite 数据库
- html - 启用滚动触摸 IE
- bash - 将命令附加到历史记录而不删除最后一个命令
- reactjs - 使用具有工作 url mp4 的 Video 组件未显示 React Native Video
- authentication - Ngrok 身份验证令牌文件位置
- android - Firebase Crashlytics NDK uploadCrashlyticsSymbolFile 任务 NullPointerException
- reactjs - 悬停时突出显示单元格
- laravel - 如何从 Homestead Vagrant VirtualBox 中恢复我的 MySQL 数据库?