使用常量结构时“初始化元素不是常量”

问题描述 投票:0回答:1

我正在使用 PIC32、MPLABX 和 XC32,目前我必须为每个外设进行大量的硬件描述。有些任务类似于:

在文件1.h中

extern const stream_t EHAL_PIN_STREAM_TEMPLATE;

在文件1.c中

const stream_t EHAL_PIN_STREAM_TEMPLATE = { 
    .field1 = constant, .field2 = constant, ... 
}

在文件2.h中

#include "file1.h"

const stream_ehal_pin_t EHAL_STREAM_PIN_RF1 = {
    .stream = EHAL_PIN_STREAM_TEMPLATE,
    .pin = &EHAL_PIN_RF1
};

基本上,我正在我们的流和 PIC32.RF1 数字引脚之间创建一个映射,并且我想使用 const 全局变量来实现此映射,但是当我尝试使用

initializer element is not constant
时,出现
EHAL_PIN_STREAM_TEMPLATE
错误。

除了在运行时进行

EHAL_STREAM_PIN_RF1
初始化之外,你还知道任何解决方案吗?

编辑

因为我不想进行运行时初始化,所以我的解决方案是为每个

EHAL_PIN_STREAM_TEMPLATE
字段创建一个宏,并使用这些宏来填充
EHAL_STREAM_PIN_RF1
结构:

 #include "file1.h"

 const stream_ehal_pin_t EHAL_STREAM_PIN_RF1 = {
    .stream = {FIELD1_TEMPLATE_VALUE, FIELD2_TEM...},
    .pin = &EHAL_PIN_RF1
 };
c gcc embedded mplab pic32
1个回答
3
投票

不可能做你想做的事。

有三个时间点进行初始化:

  • 编译时

  • 链接时间

  • 运行时

编译时初始化需要编译时的值 - 您可以为此使用宏,但不能使用来自不同编译单元(不同的 .c 文件)的变量值,因为在该编译单元之外根本不可用。

链接时初始化对于简单值不存在,它仅存在于其他编译单元内变量/函数的地址。因此,您可以使用不同编译单元中某些内容的地址来初始化变量,并且该地址将在链接期间被替换。

运行时初始化也是一个选项,但你不喜欢那样......

通常,如果不需要运行时初始化,人们会出于此目的在头文件(可以包含到多个 .c 文件中)中定义宏。

© www.soinside.com 2019 - 2024. All rights reserved.