c 中的全局结构(初始化元素不是编译时常量)
Global struct in c (initializer element is not a compile-time constant)
我是 C 的新手,遇到了一些问题。
我有以下结构定义:
struct env {
struct env *next;
char varName[8];
int n;
};
我想最终在我的一些函数中创建多个这样的结构,所以我创建了一个函数来做到这一点:
struct env *mkEnv(char c[8] , int value , struct env *toadd){
struct env *enviroment = malloc(sizeof(struct env));
enviroment->n = value;
enviroment->next = toadd;
strcpy(enviroment->varName , c);
return enviroment;
}
我想创建一个像这样的全局结构,它具有一些常量值并且最初具有指向下一个结构的指针 NULL。
所以我做了这样的事情:
//not in a function
struct env *list = mkEnv("pot" , 0 , NULL);
//Beginning of a function
int eval(struct expression *exp){
... // code here that might add a new structure to the pointer of list
}
但是我收到以下错误:
evalexp.c:116:20: error: initializer element is not a compile-time
constant struct env *list = mkEnv("p" , 0 , NULL);
我在谷歌上搜索了错误信息后明白了这个错误的含义,但是
有没有办法在函数外部的某处创建结构而不会出现此编译错误?
为了更清楚:
我想创建一个如上定义的结构(就好像它是列表的头部)。这样我所有的函数都可以访问它并向它添加东西。那就是将其解析为列表 and/or 在该列表中添加新元素。
提前致谢!
无法在文件范围内调用函数。
您必须使用常量值并定义实际的结构变量:
struct env lists = { NULL , "pot" , 0 };
struct env *list = &lists;
现在指针list
已经初始化,可以使用了,但是要注意它不是用malloc创建的,所以不能freed或者重新分配已分配。
定义变量,并在main
中初始化。
struct env *list;
int main() {
list = mkEnv("pot" , 0 , NULL);
....
}
有时,库会让您调用一个函数来初始化库,然后再使用它的任何函数。为他们使用的全局变量赋值是他们这样做的原因之一。
您可以使用以下语法:
struct env
{
struct env *next;
char varName[8];
int n;
};
struct env *list = &((struct env){ NULL, "pot" , 0});
注意应用于初始化器的结构转换和应用于它的 addess of
运算符 &
;-)
详细部分:(struct env){ NULL, "pot" , 0}
告诉编译器初始化器 { NULL, "pot" , 0}
被引用到结构 struct env
,这指示编译器创建 struct env
的初始化实例。然后我们得到这个结构的地址,使用&
运算符,并将它赋值给指针list
.
适用于 C99 和 C11 编译器。
我是 C 的新手,遇到了一些问题。
我有以下结构定义:
struct env {
struct env *next;
char varName[8];
int n;
};
我想最终在我的一些函数中创建多个这样的结构,所以我创建了一个函数来做到这一点:
struct env *mkEnv(char c[8] , int value , struct env *toadd){
struct env *enviroment = malloc(sizeof(struct env));
enviroment->n = value;
enviroment->next = toadd;
strcpy(enviroment->varName , c);
return enviroment;
}
我想创建一个像这样的全局结构,它具有一些常量值并且最初具有指向下一个结构的指针 NULL。
所以我做了这样的事情:
//not in a function
struct env *list = mkEnv("pot" , 0 , NULL);
//Beginning of a function
int eval(struct expression *exp){
... // code here that might add a new structure to the pointer of list
}
但是我收到以下错误:
evalexp.c:116:20: error: initializer element is not a compile-time constant struct env *list = mkEnv("p" , 0 , NULL);
我在谷歌上搜索了错误信息后明白了这个错误的含义,但是 有没有办法在函数外部的某处创建结构而不会出现此编译错误?
为了更清楚: 我想创建一个如上定义的结构(就好像它是列表的头部)。这样我所有的函数都可以访问它并向它添加东西。那就是将其解析为列表 and/or 在该列表中添加新元素。
提前致谢!
无法在文件范围内调用函数。
您必须使用常量值并定义实际的结构变量:
struct env lists = { NULL , "pot" , 0 };
struct env *list = &lists;
现在指针list
已经初始化,可以使用了,但是要注意它不是用malloc创建的,所以不能freed或者重新分配已分配。
定义变量,并在main
中初始化。
struct env *list;
int main() {
list = mkEnv("pot" , 0 , NULL);
....
}
有时,库会让您调用一个函数来初始化库,然后再使用它的任何函数。为他们使用的全局变量赋值是他们这样做的原因之一。
您可以使用以下语法:
struct env
{
struct env *next;
char varName[8];
int n;
};
struct env *list = &((struct env){ NULL, "pot" , 0});
注意应用于初始化器的结构转换和应用于它的 addess of
运算符 &
;-)
详细部分:(struct env){ NULL, "pot" , 0}
告诉编译器初始化器 { NULL, "pot" , 0}
被引用到结构 struct env
,这指示编译器创建 struct env
的初始化实例。然后我们得到这个结构的地址,使用&
运算符,并将它赋值给指针list
.
适用于 C99 和 C11 编译器。