首页 > 解决方案 > 如何在另一个结构中使用结构的功能?

问题描述

我正在用 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;
}

有人能帮我吗?(如果您发现代码中有些不一致,那是因为我尝试了从我的语言快速翻译)

标签: cstruct

解决方案


因此,正如建议的那样,问题在于在 Windows 的编译器中,当您使用使用其他结构中定义的函数的结构时,需要在编译期间传递 .obj 文件。为此,您需要编译其他人使用的每个 .c 文件,然后链接在此过程中创建的 .obj 文件。所以在我的情况下,第一步是编译:

cl card.c

创建一个 card.obj (Windows 的编译器可能会向您显示一条消息,例如:“未指示起点”如果您不在第一个文件中使用 main,请不要担心并继续这个过程)然后我编译:

cl player.c /link card.obj

因此,通过这种方式,您可以传递编译后的对象,其中提供了结构中所有函数的实现。


推荐阅读