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

时间:2014-01-06 17:44:20

标签: c gcc embedded pic mplab

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

在file1.h

extern const stream_t EHAL_PIN_STREAM_TEMPLATE;

在file1.c中

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

在file2.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
 };

1 个答案:

答案 0 :(得分:3)

不可能做你想做的事。

初始化有三个时间点:

  • 编译时

  • 链接时

  • 运行时

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

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

运行时初始化也是一种选择,但你不喜欢......

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