我从802.15.4上实施AES的旧项目中获得了代码 它定义了默认键,如下所示:
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 :(得分:3)
C要求您具有常量初始值设定项。在您的情况下,mac_key_table
数组在文件范围声明,而在文件范围声明的对象具有静态存储持续时间。
在C中,对象的值不被视为常量。您尝试添加const
关键字但在C const
中不会将对象限定为常量,而是只读。< / p>
C中常量表达式的示例是文字,带文字或枚举成员的表达式。
答案 1 :(得分: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,
...
};