我正在使用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
};
答案 0 :(得分:3)
不可能做你想做的事。
初始化有三个时间点:
编译时
链接时
运行时
编译时初始化需要编译时的值 - 您可以使用宏,但不能使用来自不同编译单元(不同的.c文件)的变量值,因为在编译单元之外它是不可用的。 / p>
简单值不存在链接时初始化,它仅存在于其他编译单元中的变量/函数的地址。因此,您可以使用不同编译单元中的某个地址初始化变量,并且在链接期间将替换该地址。
运行时初始化也是一种选择,但你不喜欢......
通常,如果不需要运行时初始化,人们会在头文件中定义宏(可以包含在多个.c文件中),如果不需要运行时初始化。