Как правильно использовать определение двух структур в одном исходном файле C - PullRequest
0 голосов
/ 27 декабря 2018

Мне нужна помощь с structs в C.

В основном я пытаюсь создать определение структуры Student и Group.Имейте в виду, что Group struct будет содержать Student structs ранее реализованных.

Ниже моего определения структур:

Структура студента: student.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFAULT_MATRICOLA 815010

typedef struct Student{
    int matricola;
    int voto_archi;
    char *turno;
}Student;

int generateVoto(){
    return (rand() % (30 - 18)) + 18;
}

char* generateTurno(int matricola){
    char *res = malloc(2*sizeof(char) + 1);
    if(matricola % 2 == 0)
        res = "T2";
    else    
        res = "T1";
    return res;
}

void initializeStudent(Student s, int matricola){
    s.matricola = matricola;
    s.voto_archi = generateVoto();
    if(s.matricola % 2 == 0){
        strcpy(s.turno, "T2");
    }
    else{
        strcpy(s.turno, "T1");
    }
}

void showStudent(Student s){
    printf("Matricola: %d Voto: %d Turno: %s\n", s.matricola, s.voto_archi, s.turno);
}

Student createStudent(int matricola){
    int voto = generateVoto();
    char *turno = generateTurno(matricola);
    Student s = {matricola, voto, turno};
    return s;
}

Структура группы:group.h

#include "headers.h"
#include "student.h"
#define MAX_MEMBERS 4

typedef struct Group{
    int groupId;
    Student *members;
    int numMembers;
    boolean closed;
}Group;

Group createGroup(int groupId){
    Group g;
    g.groupId = groupId;
    g.members = malloc(MAX_MEMBERS * sizeof(Student) + 1);
    g.numMembers = 0;
    g.closed = FALSE;
    return g;
}

void printGroup(Group g){
    int index = g.numMembers;
    if(index == 0)
        printf(RED "Group %d is EMPTY\n" RESET, g.groupId);
    else{
        for(int i = 0; i < MAX_MEMBERS; i++)
                showStudent(g.members[i]);
        printf("\n");
    }
}

Теперь даже пустой класс main.c, содержащий только #include "student.h и #include "group.h, не сможет скомпилироваться, но если мы добавим только один из этих двух, он будет работать хорошо.

Вот вывод компилятора:

Compiler's output if we try to compile C source file with those 2 files included

Теперь, наконец, мой вопрос:

Как создать класс main.c, используя обаstudent.h и group.h файлы?Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Теперь даже пустой класс main.c, содержащий только #include "student.h and #include" group.h, не сможет скомпилироваться, но если мы добавим только один из этих двух, он будет работать хорошо.

Очевидно, вам не хватает защиты для защиты ваших заголовочных файлов, которые выглядят примерно так (для каждого .h файла):

#ifndef STUDENT_H
#define STUDENT_H

// your header file goes here

#endif STUDENT_H

В качестве альтернативы, вы можете использовать #pragma once в начале каждогозаголовочный файл (который, предположительно, лучше и короче).

0 голосов
/ 27 декабря 2018

Вам нужно обернуть все файлы заголовков в "include guard", чтобы, если содержимое заголовка уже было включено, при любом последующем включении содержимое будет пропущено во избежание переопределений:

Например, для group.h у вас может быть:

#if !defined GROUP_H
#define GROUP_H

// all Header file content here...

#endif // GROUP_H

, где макрос (GROUP_H) в этом случае должен быть уникальным для всего проекта - обычно используется имя, основанное на имени файла.

Альтернативой, поддерживаемой многими инструментами, является использование директивы #pragma once:

#pragma once

// all Header file content here...

Это менее переносимо, но более надежно, чем традиционное средство защиты include.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...