在 C 中为结构体分配常量值

问题描述 投票:0回答:1

这是一个结构体数组,其元素声明为

const

它还使用
extern
关键字在头文件中作为全局传递。

// foo.h file
typedef enum
{
  A = 0,
  B,
  C,
  NAMES_MAX,
}Names_t;

typedef struct
{
  const int x;
  const int y;
}Foot_t;

// my global array.
extern const Foot_t FOO[NAMES_MAX];

.

// foo.c file
const Foot_t FOO[NAMES_MAX] =
{
  [A] = { .x = 1, .y = 1},
  [B] = { .x = 2, .y = 2},
  [C] = { .x = 3, .y = 3},
};

我使用

Names_t
作为结构
FOO
的索引。

现在我尝试使用我的全局结构体为另一个结构体赋值。

// bar.c file
typedef struct
{
  const int x;
  const int y;
}Bar_t;

static Bar_t BAR =
{
  .x = FOO[A].x,
  .y = FOO[A].y,
};

但是我收到错误“初始化元素在 C 中不是常量”。
我知道错误的含义,

FOO
实际上并不是 C++ 中的常量表达式。

问题是如何通过维护上述结构来解决此错误?

c constants
1个回答
0
投票

在文件范围或使用关键字

static
声明的对象,即具有静态存储持续时间的对象,必须使用常量表达式以及另一个值的值(无论是否声明
const
)进行初始化) 不是这样的表达式。您需要显式初始化这些值。

此外,将

struct
的成员声明为
const
也不是一个好主意。当您尝试使用该结构时,它可能会导致问题。您最好将特定实例声明为
const
而不是成员,即:

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

const Foot_t FOO[NAMES_MAX] =
{
  [A] = { .x = 1, .y = 1},
  [B] = { .x = 2, .y = 2},
  [C] = { .x = 3, .y = 3},
};
© www.soinside.com 2019 - 2024. All rights reserved.