Ошибка компилятора с определением структуры в заголовочном файле - PullRequest
2 голосов
/ 28 апреля 2019

У меня постоянно возникает проблема с компилятором при попытке использовать struct, который я определил в заголовочном файле.

У меня есть два файла: main.c:

     #include <stdio.h>
     #include <stdlib.h>
     #include "node.h"

     int main(){
         struct NODE node;
         node.data = 5;
         printf("%d\n", node.data);
         return 0;
     }

, а также node.h:

#ifndef NODE
#define NODE
    struct NODE{
        int data;
        struct NODE *next;
    };

#endif

Я писал небольшую программу, чтобы попрактиковаться в модульном программировании на C, но я получаю следующую ошибку компилятора:

node.h:5:21: error: expected ‘{’ before ‘*’ token
         struct NODE *next;
                     ^

Я получил main.c, чтобы скомпилировать и сделать то, что я хотел бы, когда я определяю struct непосредственно в файле main.c, но по какой-то причине он не будет работать, если я поместу определение в файл заголовка, а затем попробуйте включить его в main.c. Это очень расстраивает, и я уверен, что это мелочь, но может кто-нибудь сказать мне, почему это не работает? Из того, что я читал, я должен быть в состоянии сделать это, нет?

Большое спасибо!

Ответы [ 2 ]

6 голосов
/ 28 апреля 2019

Препроцессор расширяет NODE до нуля, потому что вы определили его с помощью макроса.Измените заголовочный файл, чтобы он выглядел так:

#ifndef NODE_H
#define NODE_H
    struct NODE{
        int data;
        struct NODE *next;
    };

#endif
3 голосов
/ 28 апреля 2019

Вы определили макрос NODE как ничто. С этого момента каждый узел в вашем исходном коде заменяется ничем. Итак, ваш заголовочный файл на самом деле:

struct{
    int data;
    struct *next;
};

Это должно ответить на ваш вопрос, почему смена защиты включения с NODE на NODE_H исправляет это.

...