Неполное определение при использовании структуры в заголовочном файле - PullRequest
1 голос
/ 11 февраля 2020

Когда я пытаюсь скомпилировать эту программу без структуры в файлах functions.h и functions.c, она работает. Но при использовании структуры это не работает.

Как правильно использовать структуры с этими .h и .c файлами?

main. c file

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

    int main(void) {
      func1();
      func2();
      //make a linked list of persons

      person * head = NULL;
      head = (person *) malloc(sizeof(person));
      if (head == NULL) {
          return 1;
      }
      head->val = 1;
      head->next = NULL;

      return 0;
    }

файл functions.h

struct node;  
typedef struct node person;
void func1(void);
void func2(void);

функций. c файл

 #include "functions.h"

    struct node {
        char name;
        int age;
        node *next;
    };

    void func1(void) {
        printf("Function 1!\n");
    }

    void func2(void) {
        printf("Function 2!\n");
    }

Скомпилируйте его с помощью:

g cc -o main.exe main. c функции. c

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Вы можете использовать непрозрачные типы (неполные типы) только тогда, когда вам не нужно знать размер или «содержимое» типа - это означает, что вы можете использовать непрозрачный тип только тогда, когда вам нужны только указатели на тип. Если вам нужен размер, как в main(), когда вы пытаетесь выделить достаточно места для человека, вы не можете использовать непрозрачный тип.

Либо создайте функцию выделения в functions.c, объявите ее в functions.h и вызовите его в main.c, или определите тип в functions.h для использования в main.c и functions.c.

В вашем коде функция main() также обращается к членам структуры (head->val, head->next), поэтому определение типа в functions.h является наиболее подходящим.

0 голосов
/ 11 февраля 2020

Добавить в functions.h:

typedef struct node {
        char name;
        int age;
        node *next;
    } person;

в functions.h сделал трюк, как было написано Джонатан Леффлер!

Удалить из файла functions.h:

struct node;  
typedef struct node person;

Удалить из функций. c Файл:

struct node {
    char name;
    int age;
    node *next;
};
...