Different implementations of a C header file

c, header

Solution

This maybe jumping in a bit too much at the deep end, but:

You might be after a pointer to function plus several implementations of functions with different names that do the task.

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

So, somewhere along the line, you call one of the `setXxxxxMover()` functions, and thereafter you move using the mechanism set by the last of the two functions called.

You can also invoke the function using the long-hand notation:

    MoveDirection dir = (*takeDirection)(gs);

Once upon a very long time ago (1980s and earlier), this notation was necessary. I still like it because it makes it clear (to me) that it is a pointer-to-function that is being used.

Problem

How can I add multiple implementations to this header file: MoveAgent.h ``` #ifndef _GAMEAGENT_ #define _GAMEAGENT_ #include "Defs.h" #include "GameModel.h" MoveDirection takeDirection(GameState *gs); #endif _GAMEAGENT_ ``` MoveAgent.c: Let's say that I have an implementation that will return a random move ``` 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; } ``` What is practical way of having multiple implementations of that function? As you might guess, I'm a Java programmer trying to make a basic game to learn C, so I'm trying to do this to simulate a Java interface. Any ideas?

Original source