如何使用全局范围内的const结构初始化结构数组?

时间:2017-08-08 20:17:20

标签: c arrays struct

我想使用类似于以下的代码(但更复杂 - 这是一个简化的例子)来初始化结构数组,但在编译期间我得到错误"表达式必须具有常量值&# 34。

typedef struct
{
    int x;
    int y;
} windowStruct_t;

static const windowStruct_t windowStructInit =
{
    .x = 3,
    .y = 5,
};

// These get defined differently at times.  This is simplified for the example.
#define NUM_ARRAY_ELEMENTS (2)
#define REPEAT_NUM_ARRAY_ELEMENTS_TIMES(x) (x),(x)

// The following line causes the error "expression must have a constant value" twice.
windowStruct_t windowStruct[ NUM_ARRAY_ELEMENTS ] = 
    { REPEAT_NUM_ARRAY_ELEMENTS_TIMES( windowStructInit ) };

void someFunction( void )
{
    volatile int x = windowStruct[0].x;
}

void anotherFunction( void )
{
    volatile int y = windowStruct[1].y;
}

手动扩展宏并使用以下内容替换导致错误的行会产生相同的结果:

windowStruct_t windowStruct[ NUM_ARRAY_ELEMENTS ] = 
    { windowStructInit, windowStructInit };

但是这个编译没有错误:

windowStruct_t windowStruct[ NUM_ARRAY_ELEMENTS ] =
    { { .x = 3, .y = 5 }, { .x = 3, .y = 5 } };

如果我在函数范围内移动数组声明,它编译时没有错误(我忽略了someFunction()和anotherFunction()现在访问不同的数组并且它们的生命周期不同的事实:

void someFunction( void )
{
    windowStruct_t windowStruct[ NUM_ARRAY_ELEMENTS ] = 
        { REPEAT_NUM_ARRAY_ELEMENTS_TIMES( windowStructInit ) };

    volatile int x = windowStruct[0].x;
}

void anotherFunction( void )
{
    windowStruct_t windowStruct[ NUM_ARRAY_ELEMENTS ] = 
        { REPEAT_NUM_ARRAY_ELEMENTS_TIMES( windowStructInit ) };

    volatile int y = windowStruct[1].y;
}

将数组声明留在函数作用域内,如果它们被声明为" static",则会返回错误消息:

void someFunction( void )
{
    static windowStruct_t windowStruct[ NUM_ARRAY_ELEMENTS ] = 
        { REPEAT_NUM_ARRAY_ELEMENTS_TIMES( windowStructInit ) };

    volatile int x = windowStruct[0].x;
}

所以似乎当数组被声明为自动变量(在堆栈上)时,它们可以在内存分配是静态的时候被允许初始化(无论是在函数范围内还是在全局范围内)即使没有"静态"关键字,分配也是静态的。有没有办法在原始示例中使用const结构初始化全局范围内的数组?

我使用的是C,而不是C ++。我不想使用动态内存分配。编译器是TI的编译器V16.6.0.STS,包含在Code Composer Studio环境中。

1 个答案:

答案 0 :(得分:3)

const对象不是C 常量。而是使用非自动存储对象所需的常量

定义初始值设定项{ .x = 3, .y = 5 }

typedef struct windowStruct_s {
  int x;
  int y;
} windowStruct_t;

#define windowStruct_t_default_initializer { .x = 3, .y = 5 }
#define NUM_ARRAY_ELEMENTS (2)
#define REPEAT_NUM_ARRAY_ELEMENTS_TIMES(x) x, x /* no () */

windowStruct_t windowStruct[NUM_ARRAY_ELEMENTS] = {
    REPEAT_NUM_ARRAY_ELEMENTS_TIMES(windowStruct_t_default_initializer) };

int someFunction(void) {
  volatile int x = windowStruct[0].x;
  return x;
}

int anotherFunction(void) {
  volatile int y = windowStruct[1].y;
  return y;
}