2014-01-06 63 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文件) ,如果不需要運行時初始化。