C код компилируется только когда я включаю. c файл - PullRequest
0 голосов
/ 16 января 2020

Когда я пытаюсь скомпилировать код, он работает только тогда, когда я включаю Объект. c в Словаре. c. Как часть моего HW я не могу изменить Dictionary.h и main и не могу объявить структуры в .h файле. Не могли бы вы предложить исправление?

object.h

#ifndef __OBJECT_H
#define __OBJECT_H

typedef struct Object Object;

Object createObject (int key, int value);

int getKey (Object object);
int getValue (Object object);
int isSmaller (Object x, Object y);

#endif

object. c:

#include "object.h"

struct Object 
{
    int key;
    int value;
};

Object createObject (int key, int value)
{
    Object object = {key,value};
    return object;
}

int getKey (Object object)
{
    return object.key;
}

int getValue (Object object)
{
    return object.value;
}

int isSmaller (Object x, Object y)
{
    if (x.key < y.key)
        return 1;
    return 0;
}

словарь. c

#include <stdio.h>
#include <stdlib.h>
#include "object.h"
#include "object.c"
#include "dictionary.h"

struct Dictionary
{
    Object* array;
    int sizeOfArray;
    int numOfObjects;
};

Ответы [ 2 ]

4 голосов
/ 16 января 2020

Вы не можете объявить переменную или поле как структуру без предварительного определения структуры. Это потому, что компилятору нужно знать его размер (и смещения полей, если вы их используете), а для этого требуется определение.

Однако объявление указателей на структуру, которая не была определена, совершенно хорошо, так как компилятор знает размер указателя. Поэтому, когда желательно иметь непрозрачный тип, можно использовать интерфейс, основанный на указателях на структуру, поскольку это избавляет от необходимости определять структуру в файле заголовка.

Например,

object.h:

#ifndef __OBJECT_H
#define __OBJECT_H

typedef struct Object Object;

Object* Object_new(int key, int val);
void Object_delete(Object* object);

int Object_get_key(const Object* object);
int Object_get_val(const Object* object);

int Object_is_smaller(const Object* x, const Object* y);

#endif

object.c:

#include <stdlib.h>
#include "object.h"

struct Object {
    int key;
    int val;
};

Object* Object_new(int key, int val) {
    Object* object = malloc(sizeof(Object));
    if (!object)
        return NULL;

    object->key = key;
    object->val = val;
    return object;
}

void Object_delete(Object* object) {
    free(object);
}

int Object_get_key(const Object* object) { return object->key; }
int Object_get_val(const Object* object) { return object->val; }

int Object_is_smaller(const Object* x, const Object* y) { return x->key < y->key; }

Пример пользователя:

#include <stdio.h>
#include "object.h"

int main(void) {
    Object* object = Object_new(4, 5);
    printf("%d: %d\n",
        Object_get_key(object),
        Object_get_val(object)
    );

    Object_delete(object);
    return 0;
}
1 голос
/ 16 января 2020

не может объявить структуры в файле .h

Почему? Файлы .h являются подходящим местом для определения структур, которые будут использоваться несколькими. c файлами!


Переместите определение типа в object.h

#ifndef __OBJECT_H
#define __OBJECT_H

typedef struct Object Object;

// type definition in header file
struct Object 
{
    int key;
    int value;
};

Object createObject (int key, int value);

int getKey (Object object);
int getValue (Object object);
int isSmaller (Object x, Object y);

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