C的误差:表达式必须具有恒定值(C error: expression must have a co

2019-06-26 14:44发布

我写了一些嵌入式代码有超过SPI外部设备接口。 该设备具有不同的长度,并让事情简单一点我已经定义了以下结构的多个寄存器

typedef struct
{
    uint16_t    Signed          :1;  // Register is signed or unsigned
    uint16_t    CommLengthBytes :3;  // The width of the register in bytes 
    uint16_t    Address         :12; // Register address
}ts_register;

我曾经那么在我的源代码中定义每个寄存器如下

static const ts_register    SAGCYC      = {0, 1, 0x000};
static const ts_register    DISNOLOAD   = {0, 1, 0x001};
static const ts_register    LCYCMODE    = {0, 1, 0x004};
static const ts_register    IRMSA       = {0, 4, 0x31A};
static const ts_register    IRMSB       = {0, 4, 0x31B};
static const ts_register    VRMS        = {0, 4, 0x31C};

等等

我有,将采取的指针ts_registers的阵列,并且排队读取所有寄存器的阵列中的所需的SPI传输并调用回调函数来处理所述回复的功能

我的问题是当我试着让我想读如下ts_registers的数组:

ts_register regs_to_read[3] = {VRMS, IRMSA, IRMSB};

这将生成错误:“表达式必须具有恒定的值” 3倍(每个数组元素一次)。

由于他们被定义为常数,你有什么我忽略了?

Answer 1:

由于他们被定义为常数,你有什么我忽略了?

在C与声明的对象const修饰符不是真正的常量 。 为常量一个更好的名字可能会是readonly -它真正的意思是,编译器不会让改变它。 而你需要真正的常量来初始化静态存储(我怀疑对象regs_to_read是全球性的)。

你可以尝试分配regs_to_read在别的之前调用函数使用数组。



Answer 2:

常量并不能让他们在编译时间常数。 让他们#define和编译器会很高兴。



Answer 3:

我觉得这可能是一个编译器的问题,这将有助于了解你的平台,你是如何构建这个代码。 我只是把大部分代码,篡改它,编译它,并使用gcc在Linux上编译。 有没有警告。

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>

typedef struct
{
    uint16_t    Signed          :1;  // Register is signed or unsigned
    uint16_t    CommLengthBytes :3;  // The width of the register in bytes 
    uint16_t    Address         :12; // Register address
}ts_register;

int main(int argc, char **argv) {

    static const ts_register    SAGCYC      = {0, 1, 0x000};
    static const ts_register    DISNOLOAD   = {0, 1, 0x001};
    static const ts_register    LCYCMODE    = {0, 1, 0x004};
    static const ts_register    IRMSA       = {0, 4, 0x31A};
    static const ts_register    IRMSB       = {0, 4, 0x31B};
    static const ts_register    VRMS        = {0, 4, 0x31C};

    ts_register regs_to_read[3] = {VRMS, IRMSA, IRMSB};

    return(0);
}

您是否尝试过铸造的价值观? 这并不总是做的最好的事情,但会得到你周围的错误。

你有没有考虑创建的#define项?

另外,请注意consts需要一点时间来适应在C.他们并不总是表现得你所期望的方式。



文章来源: C error: expression must have a constant value