gpt4 book ai didi

仅当我包含 .c 文件时,C 代码才会编译

转载 作者:行者123 更新时间:2023-11-30 18:23:12 25 4
gpt4 key购买 nike

当我尝试编译代码时,只有当我将 Object.c 包含在 Dictionary.c 中时,它才有效。作为我的硬件的一部分,我无法更改 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;
};

最佳答案

如果没有首先定义结构,则无法将变量或字段声明为结构。这是因为编译器需要知道它的大小(以及字段的偏移量,如果您使用这些字段),而这需要定义。

但是,声明指向尚未定义的结构的指针是完全可以的,因为编译器知道指针的大小。因此,当需要不透明类型时,可以使用基于结构体指针的接口(interface),因为这样可以避免在头文件中定义结构体。

例如,

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

关于仅当我包含 .c 文件时,C 代码才会编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59768156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com