标题开始 - 前瞻宣言

时间:2014-05-29 07:28:18

标签: c forward-declaration

所以,我有这样的事情:

main.c,enemy.c,player.c,technique.c,dialog.c
和他们的标题:
main.h,enemy.h,player.h,technique.h,dialog.h

一切正常,我使用了所有这些,除了来自enemy.c(这个文件没有任何功能)。 我决定启动敌人攻击的代码。

    void eAttack(player *p, enemy *e)
    {
    code;
    }

但我收到的错误是这样的:

    In file included from main.c:1:
    In file included from ./include/main.h:8:
    In file included from ./include/player.h:8
    ./include/enemy.h:18:14: error: unknown type name 'player'
    void eAttack(player *p, enemy *e);

事情是,我在player.c,pAttack(玩家* p,敌人* e)具有相同的功能;
它一直很好,直到我开始编码enemy.c 我读到了它,我认为这个问题是前瞻性声明和“后卫”。因为如果我删除#include" player.h"来自敌人,它对于player.c也是如此,如果我擦掉它们仍然不起作用。 我只发现了c ++的答案,但仍然不知道如何使用C来解决这个问题。

1 个答案:

答案 0 :(得分:0)

因此player必须知道enemy.c类型,而enemy类型必须知道player.c吗?

您必须在这些类型声明后包含您的标题,以避免unknown type s:

/ * main.c * /

#include "player.h"
#include "enemy.h"

int main(void)
{
    player p = {1};
    enemy e = {2};

    pAttack(&p, &e);
    eAttack(&p, &e);
    return 0;
}

/ * player.h * /

#ifndef PLAYER_H
#define PLAYER_H

typedef struct {
    int bla;
} player;

#include "enemy.h"

void pAttack(player *p, enemy *e);

#endif

/ * enemy.h * /

#ifndef ENEMY_H
#define ENEMY_H

typedef struct {
    int bla;
} enemy;

#include "player.h"

void eAttack(player *p, enemy *e);

#endif

/ * player.c * /

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

void pAttack(player *p, enemy *e)
{
    printf("%d %d\n", p->bla, e->bla);
}

/ * enemy.c * /

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

void eAttack(player *p, enemy *e)
{
    printf("%d %d\n", p->bla, e->bla);
}