【问题标题】:C compilation error - expression must have a constant valueC 编译错误 - 表达式必须有一个常量值
【发布时间】:2012-09-25 07:43:36
【问题描述】:

我从一个在 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。但这并没有帮助,我知道编译器无法用变量初始化结构,但是这些变量是常量,那么这里有什么问题?

【问题讨论】:

  • 其他编译器可能是C++。

标签: c arrays compiler-errors


【解决方案1】:

如果变量具有静态存储持续时间,C 要求您具有常量初始值设定项。在您的情况下,mac_key_table 数组是在文件范围内声明的,而在文件范围内声明的对象具有静态存储持续时间。

在 C 中,对象的值不被视为常量。您尝试添加 const 关键字,但在 C 中,const 不将对象限定为常量,而是只读

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,
      ...
    };
    

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多