2012-09-25 44 views
1

我802.15.4 有一個代碼執行AES舊項目它定義了默認的關鍵是這樣的:C語言編譯錯誤 - 表達式必須有一個恆定的值

static uint8_t default_key_source[8] = {0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 

事後定義表,以下列方式使用它:

uint8_t mac_key_table[34] = 
{ 
    // KeyIdLookupList[1].LookupData : macDefaultKeySource || g_Sec_KeyIndex_1 
    default_key_source[0], // LookupData[0] 
    default_key_source[1], // LookupData[1] 
    default_key_source[2], // LookupData[2] 
    default_key_source[3], // LookupData[3] 
    default_key_source[4], // LookupData[4] 
    default_key_source[5], // LookupData[5] 
    default_key_source[6], // LookupData[6] 
... 
} 

我在編譯時得到「表達式必須有一個常量值」的錯誤。這是奇怪的,因爲它用於編譯不同的編譯器(不知道究竟是哪一個,但我使用ARM的IAR嵌入式工作臺)

我試着在default_key_source的靜態聲明之前添加const。但它沒有幫助,我知道編譯器不能用變量初始化結構,但是這些變量是常量,所以這裏有什麼問題?

+0

這可能是其他編譯器是C++。 –

回答

2

一個簡單的方法來處理在C這樣的情況是使用宏,以確保你只在一個地方定義常量:

#define DEFAULT_KEY_SOURCE 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 

// if you really need that variable 
static default_key_source[8] = { DEFAULT_KEY_SOURCE }; 

uint8_t mac_key_table[34] = 
{ 
    DEFAULT_KEY_SOURCE, 
    ... 
}; 
3

如果變量具有靜態存儲持續時間,則C需要您具有常量初始值設定項。在你的情況下,mac_key_table數組在文件範圍聲明,在文件範圍聲明的對象具有靜態存儲持續時間。

在C中,對象的值不被視爲常量。您嘗試添加const關鍵字,但在C const中沒有將對象限定爲常量而是只讀

C中的常量表達式的示例是文字,帶有文字或枚舉成員的表達式。

相關問題