当我尝试初始化包含结构元素的全局数组时,我得到了“错误:初始化元素不是常量”
A.H
#define MAX_MSG_NUM 20
#define NAME_SIZE 15
#define MAX_QUE_NUM 10
typedef struct {
int index;
int tid;
int front;
int rear;
char name[NAME_SIZE];
char msgbuf[MAX_MSG_NUM];
} THREAD;
typedef enum {
I1 = 0,
I2 = 1,
I3 = 2,
I4 = 3
} DMTHREAD;
交流转换器
THREAD a[MAX_MSG_NUM];
THREAD b[MAX_MSG_NUM];
THREAD c[MAX_MSG_NUM];
THREAD T[MAX_QUE_NUM] = {
{I1, 0, 0, 0, "CONFIG1", a[MAX_MSG_NUM]},
{I2, 0, 0, 0, "CONFIG2", b[MAX_MSG_NUM]},
{I3, 0, 0, 0, "CONFIG3", c[MAX_MSG_NUM]},
0
};
GCC编译器。
bash-3.2$ gcc -g a.h a.c
a.c:8: error: initializer element is not constant
a.c:8: error: (near initialization for 'T[0].msgbuf[0]')
a.c:9: error: initializer element is not constant
a.c:9: error: (near initialization for 'T[1].msgbuf[0]')
a.c:10: error: initializer element is not constant
a.c:10: error: (near initialization for 'T[2].msgbuf[0]')
通过你的回答得到启发,我改变了代码,现在工作正常。
MSG T[MAX_QUE_NUM] = {
{I1, 0, 0, 0, "CONFIG1", {0}},
{I2, 0, 0, 0, "CONFIG2", {0}},
{I3, 0, 0, 0, "CONFIG3", {0}},
0,
}
感谢您的回答。
答案 0 :(得分:3)
a[MAX_MSG_NUM]
确实是非常数。它还表示Thread
实例,它恰好位于您之前定义的数组之外,与您应该传递的类型(char[]
)不匹配。
所以在这么多级别上错误。
答案 1 :(得分:2)
您尝试在编译时分配编译器无法识别但在运行时知道的值 - 这就是导致错误的原因。
尝试在main中执行此操作,例如:
main(){
THREAD T[MAX_QUE_NUM] = {
{I1, 0, 0, 0, "CONFIG1", a[MAX_MSG_NUM]},
{I2, 0, 0, 0, "CONFIG2", b[MAX_MSG_NUM]},
{I3, 0, 0, 0, "CONFIG3", c[MAX_MSG_NUM]},
0
};
}
答案 2 :(得分:2)
在C中,具有静态存储持续时间的对象(例如在文件范围内声明的对象)只能使用常量表达式进行初始化。
例如(在文件范围内声明):
char bla[] = {1, 2, 3, 4}; // correct
int a = 1;
char blop[] = {a, a + 1}; // incorrect, a is not a constant in C