【问题标题】:Global struct in c (initializer element is not a compile-time constant)c中的全局结构(初始化元素不是编译时常量)
【发布时间】:2016-06-03 00:15:25
【问题描述】:

我对 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:错误:初始化元素不是编译时 常量 struct env *list = mkEnv("p" , 0 , NULL);

我在谷歌上搜索错误消息后了解此错误的含义,但是 有没有办法在函数之外的某处创建结构而不会出现此编译错误?

为了更清楚: 我想创建一个如上所述的结构(好像它是列表的头部)。这样我的所有功能都可以访问并向其中添加内容。也就是将其解析为列表和/或在该列表中添加新元素。

提前致谢!

【问题讨论】:

    标签: c struct global compile-time


    【解决方案1】:

    不能在文件范围内调用函数。

    您必须使用常量值并定义一个实际的结构变量:

    struct env lists = { NULL , "pot" , 0 };
    struct env *list = &lists;
    

    现在指针list已经初始化并且可以使用了,但是要注意它不是用malloc创建的,所以它不能被freed或者reallocated .

    【讨论】:

    • 谢谢!我选择了您的答案,因为它更具体地解决了我的问题!虽然其他的也是正确的!
    • 更好地使用指定初始化程序。当struct 被更改时,这不太容易出错(注意类型定义通常不直接靠近变量定义)。
    【解决方案2】:

    定义变量,并在main中初始化。

    struct env *list;
    
    int main() {
        list = mkEnv("pot" , 0 , NULL);
        ....
    }
    

    有时库会让您调用一个函数来初始化库,然后才能使用它的任何函数。为他们使用的全局变量赋值是他们这样做的原因之一。

    【讨论】:

      【解决方案3】:

      您可以使用以下语法:

      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 编译器。

      【讨论】:

        猜你喜欢
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 2017-12-03
        相关资源
        最近更新 更多