2014-01-06 62 views
0

我正在使用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数字引脚之间制作一个映射,并且我想使用常量全局变量进行设置,但是我得到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 
}; 

回答

3

这是不可能做你想做的事。

有三个点的时间,使初始化:

  • 编译时

  • 链接时

  • 运行时

编译时初始化需要编译时的值 - 你可以使用宏,但不是来自不同编译单元(另一个.c文件)的变量的值,因为该编译单元之外的编译单元不可用。

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

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

通常情况下,人们定义在头文件中的这样一个目的宏(可包含为多个.c文件) ,如果不需要运行时初始化。