Возможно, это слишком много в глубоком конце, но:
Возможно, вам нужен указатель на функцию плюс несколько реализаций функций с разными именами, которые выполняют задачу.
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);
Когда-то очень давно (в 1980-х и ранее) эта запись была необходима. Мне все еще нравится это, потому что это ясно (мне), что это указатель на функцию, которая используется.