【问题标题】:Why am I getting this error: "data definition has no type or storage class"?为什么会出现此错误:“数据定义没有类型或存储类”?
【发布时间】:2013-09-25 05:12:57
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

struct NODE {
    char* name;
    int val;
    struct NODE* next;
};
typedef struct NODE Node;

Node *head, *tail;
head = (Node*) malloc( sizeof( Node ) ); //line 21

我是这样编译的:

cc -g -c -o file.tab.o file.tab.c

我收到此错误消息:

file.y:21:1 warning: data definition has no type or storage class [enabled by default]

【问题讨论】:

    标签: c pointers struct bison cc


    【解决方案1】:

    看起来像那条线

    head = (Node*) malloc( sizeof( Node ) ); //line 21
    

    main() 函数之外。你不能这样做,因为你不能在函数之外执行代码。在全局范围内您唯一能做的就是声明变量。只需将它移到main() 或任何其他函数中,问题就会消失。

    (PS:看看this question,为什么你不应该输入malloc

    【讨论】:

    • 为此奋斗了一个小时……太傻了……现在我很尴尬哈哈,谢谢!!
    • @streppel,我在写dev_t dev; dev = MKDEV(300, 0) 时遇到同样的错误,如果我写dev_t dev = MKDEV(300, 0),我的模块运行良好。这是为什么?这背后的原因是什么?
    • @Dr.Essen MKDEV 是一个宏。结果值在编译时预先计算。
    【解决方案2】:

    尝试将 malloc 和变量声明放在 main 函数中,并删除 malloc 上的强制转换。它应该是这样的:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){
    
        struct NODE
        {
            char* name;
            int val;
            struct NODE* next;
        };
    
        typedef struct NODE Node;
    
        Node *head, *tail;
        head = malloc( sizeof(Node) ); //line 21
    }
    

    【讨论】:

    • 如果您希望项目的其他部分可以重用结构定义(及其关联的typedef),则可能需要将其移出main
    【解决方案3】:

    问题是当你不在函数内部执行时,你试图调用malloc。如果将其包装在 main 函数中,例如:

    int main(int argc, char **argv)
    {
        Node *head, *tail;
        head = (Node*) malloc( sizeof( Node ) );
        /* ... do other things ... */
        return 0;
    }
    

    ……它工作得很好。 GCC 的错误有点神秘,但问题基本上是你试图用不是常量的东西来初始化一个变量,这在函数之外是不可能的。

    【讨论】:

      【解决方案4】:

      您需要将代码放入函数中:

      #include <stdio.h>
      #include <stdlib.h>
      
      struct NODE {
          char* name;
          int val;
          struct NODE* next;
      };
      typedef struct NODE Node;
      
      main(){
          Node *head, *tail;
          head = (Node*) malloc( sizeof( Node ) ); //line 21
      }
      

      应该工作

      【讨论】:

        猜你喜欢
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 2014-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多