Faccio il mio esempio in C, che mi sembra ancora più semplice di quello di Mitaly

codice:
/* modulo.h */

#ifndef MODULO_H
#define MODULO_H

struct modulo_st {
    void (*start)();
    void (*stop)();
};

#endif

/* modulo a.c */

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

void a_start()
{
    printf("a start\n");
}

void a_stop()
{
    printf("a stop\n");
}

struct modulo_st modulo_a = {
    a_start,
    a_stop
};

/* modulo b.c */

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

void b_start()
{
    printf("b start\n");
}

void b_stop()
{
    printf("b stop\n");
}

struct modulo_st modulo_b = {
    b_start,
    b_stop
};

/* main.c */

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

extern struct modulo_st modulo_a, modulo_b;

int main()
{
    struct modulo_st *moduli[] = { &modulo_a, &modulo_b, NULL };
    int i;
    
    for (i = 0; moduli[i] != NULL; i++)
        moduli[i]->start();

    for (i = 0; moduli[i] != NULL; i++)
        moduli[i]->stop();        

    return 0;
}