我想使用类似于以下代码(但更复杂 - 这是一个简化的示例)来初始化结构体数组,但在编译过程中出现错误“表达式必须具有常量值”。
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;
}
将数组声明保留在函数作用域内,如果它们被声明为“静态”,则会返回错误消息:
void someFunction( void )
{
static windowStruct_t windowStruct[ NUM_ARRAY_ELEMENTS ] =
{ REPEAT_NUM_ARRAY_ELEMENTS_TIMES( windowStructInit ) };
volatile int x = windowStruct[0].x;
}
因此,当数组被声明为自动变量(在堆栈上)时,它们可以以内存分配静态时不允许的方式进行初始化(无论是在函数范围内还是在全局范围内,其中即使没有“static”关键字,分配也是静态的)。有没有办法像原始示例一样使用 const 结构在全局范围内初始化数组?
我使用的是 C,而不是 C++。我不想使用动态内存分配。编译器是 TI 的 ARM 编译器 V16.6.0.STS,包含在 Code Composer Studio 环境中。
最佳答案
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;
}
关于c - 如何在全局范围内使用 const 结构体来初始化结构体数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45577352/