web-dev-qa-db-ja.com

「データ定義に型またはストレージクラスがありません」というエラーが発生するのはなぜですか?

#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]
8
Daivid

線のように見えます

_head = (Node*) malloc( sizeof( Node ) ); //line 21
_

main()関数の外にあります。関数の外部でコードを実行できないため、これを行うことはできません。グローバルスコープで実行できるのは、変数を宣言することだけです。main()またはその他の関数内に移動するだけで、問題はなくなるはずです。

(追記: この質問 型キャストしてはいけない理由を見てくださいmalloc

22
Natan Streppel

コードを関数内に配置する必要があります。

#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
}

動作するはずです

1
user2797321

問題は、関数内で実行していないときにmallocを呼び出そうとしていることです。これをmain関数でラップすると、次のようになります。

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

…問題なく動作します。 GCCのエラーは少しわかりにくいですが、問題は基本的に、定数ではないもので変数を初期化しようとしていることです。これは関数の外部では不可能です。

1
Matt Patenaude

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
}
1
smnh3