Une autre alternative serait de déclarer une structure pour contenir tous vos fonctions, puis définissez vos fonctions de façon statique. Ensuite vous n'avez plus à vous soucier des conflits de nom pour le nom global struct.
// foo.h
#ifndef FOO_H
#define FOO_H
typedef struct {
int (* const bar)(int, char *);
void (* const baz)(void);
} namespace_struct;
extern namespace_struct const foo;
#endif // FOO_H
// foo.c
#include "foo.h"
static int my_bar(int a, char * s) { /* ... */ }
static void my_baz(void) { /* ... */ }
namespace_struct const foo = { my_bar, my_baz }
// main.c
#include <stdio.h>
#include "foo.h"
int main(void) {
foo.baz();
printf("%d", foo.bar(3, "hello"));
return 0;
}
Dans l'exemple ci-dessus, my_bar
et my_baz
ne peut pas être appelée directement à partir des principaux.c, que par l' foo
.
Si vous avez un tas d'espaces de noms que de déclarer des fonctions avec les mêmes signatures, alors vous pouvez normaliser
votre espace de noms de la structure de l'ensemble, et de choisir un espace de noms à utiliser lors de l'exécution.
// goo.h
#ifndef GOO_H
#define GOO_H
#include "foo.h"
extern namespace_struct const goo;
#endif // GOO_H
// goo.c
#include "goo.h"
static int my_bar(int a, char * s) { /* ... */ }
static void my_baz(void) { /* ... */ }
namespace_struct const goo = { my_bar, my_baz };
// other_main.c
#include <stdio.h>
#include "foo.h"
#include "goo.h"
int main(int argc, char** argv) {
namespace_struct const * const xoo = (argc > 1 ? foo : goo);
xoo->baz();
printf("%d", xoo->bar(3, "hello"));
return 0;
}
Les multiples définitions de l' my_bar
et my_baz
n'entrent pas en conflit, car ils sont définis de manière statique, mais que les fonctions sous-jacentes sont toujours accessibles par l'intermédiaire de l'espace de noms struct.