2012-09-25 31 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中的常量表达式的示例是文字,带有文字或枚举成员的表达式。

相关问题