c - 如何在另一个结构中使用结构的功能?
问题描述
我正在用 C 语言做一个简单的项目,目前我使用两个结构:Player 和 Card。我在不同的头文件中创建了 2 结构,因为 Player 中的函数使用 Card,但还有其他我尚未完成的元素。当我尝试在 Player 中使用 getId() 时,VSCode 的编译器会说:
_discardCard() 中未解析对外部符号 _getId 的引用
card.h 代码是:
#include <stdbool.h>
typedef struct card{
int id;
bool black;
int numElems;
char* text[3];
}card;
card* initCard(int id,bool black,char* text[],int numElems)
int getId(card* c);
card.c 代码是:
#include "carta.h"
#include<stdio.h>
#include <stdbool.h>
#include <stdlib.h>
...
int getId(carta* c){
return c->id;
}
相反, Player.h 的代码是:
#include "card.h"
#define CARDSMAX 5
typedef struct{
bool master;
int id;
int points;
char* nickname;
card* cards[CARDSMAX];
int NumCards;
}player;
... //other functions
card* discardCard(int id,player* g);
Player.c 的代码是:
#include "player.h"
#include <stdio.h>
#include <stdlib.h>
player* initPlayer(char* nickname,int id){
player* g=(player*) malloc(sizeof (player));
g->id=id;
g->nickname=nickname;
g->master=false;
g->points=0;
g->NumCards=0;
for(int i=0;i<CARDSMAX;i++){
g->cards[i]=(card*)malloc(sizeof(card));
}
return g;
}
....
card* DiscardCard(int id,player* g){
for(int i=0;i<CARDSMAX;i++){
card* c=g->cards[i];
if(getId(c)==id){
card* e= g->cards[i];
g->cards[i]=NULL;
g->NumCards--;
return e;
}
}
return NULL;
}
有人能帮我吗?(如果您发现代码中有些不一致,那是因为我尝试了从我的语言快速翻译)
解决方案
因此,正如建议的那样,问题在于在 Windows 的编译器中,当您使用使用其他结构中定义的函数的结构时,需要在编译期间传递 .obj 文件。为此,您需要编译其他人使用的每个 .c 文件,然后链接在此过程中创建的 .obj 文件。所以在我的情况下,第一步是编译:
cl card.c
创建一个 card.obj (Windows 的编译器可能会向您显示一条消息,例如:“未指示起点”如果您不在第一个文件中使用 main,请不要担心并继续这个过程)然后我编译:
cl player.c /link card.obj
因此,通过这种方式,您可以传递编译后的对象,其中提供了结构中所有函数的实现。
推荐阅读
- python - 计算 ndarray 中的唯一切片
- javascript - Javascript 子字符串没有提取正确的数据
- arrays - 将泛型结构附加到数组
- visual-studio - Blazor 的自定义 Visual Studio 项模板
- python-3.x - Pandas - 使用混合类型列样式化数据框
- ios-simulator - 如何向 SimulatorTrampoline 添加权限以访问特定文件夹
- maven - Maven 和 Spring Boot 忽略了 JUnit5 测试
- reactjs - 如何按 id 对这些数组进行分组?
- vimeo - 使用 Vimeo API 获取专辑列表及其视频无法按预期工作
- stata - 根据行中的值连接 ID