C头文件的不同实现

时间:2010-12-08 05:17:07

标签: c header

如何向此头文件添加多个实现:

MoveAgent.h

#ifndef _GAMEAGENT_
#define _GAMEAGENT_

#include "Defs.h"
#include "GameModel.h"

MoveDirection takeDirection(GameState *gs);

#endif _GAMEAGENT_

MoveAgent.c:假设我有一个将返回随机移动的实现

MoveDirection takeDirection(GameState *gs) {    
    MoveDirection dir = DIR_NONE;       
    while (dir == DIR_NONE) {
        int index = arc4random() % gs->moves_total;     
        MoveDirection tempDir = gs->moves[index];       
        if (tempDir != oppDir(gs->car.direction)) {
            dir = tempDir;
        }
    }
    return dir;
}

实现该功能的多个实现的实用方法是什么?

正如您可能猜到的那样,我是一名Java程序员,正在尝试制作基本游戏来学习C语言,因此我尝试这样做来模拟Java接口。

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

这可能会在深层跳得太多,但是:

您可能会在指向函数的指针以及具有不同名称的函数的多个实现之后执行该任务。

MoveAgent.h

extern MoveDirection (*takeDirection)(GameState *gs);

MoveAgent.c

MoveDirection takeDirectionRandom(GameState *gs)
{
    ...
}

MoveDirection takeDirectionSpiral(GameState *gs)
{
    ...
}

Mover.c

#include "MoveAgent.h"

// Default move is random
MoveDirection (*takeDirection)(GameState *gs) = takeDirectionRandom;

void setRandomMover(void)
{
    takeDirection = takeDirectionRandom;
}

void setSpiralMover(void)
{
    takeDirection = takeDirectionSpiral;
}

void mover(GameState *gs)
{
    ...;
    MoveDirection dir = takeDirection(gs);
    ...;
}

因此,在该行的某个地方,您调用其中一个setXxxxxMover()函数,然后使用由两个函数中的最后一个设置的机制进行移动。

您也可以使用长手记法调用该函数:

    MoveDirection dir = (*takeDirection)(gs);

很久以前(80年代及更早),这种符号是必要的。我仍然喜欢它,因为它清楚(对我来说)它是一个正在使用的指向函数的指针。