这是一个结构体数组,其元素声明为
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++ 中的常量表达式。
问题是如何通过维护上述结构来解决此错误?
在文件范围或使用关键字
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},
};