1: les typedefs n'ont rien à voir avec la protection de code. Les typedefs sont justes des alias.
2: les .h n'ont rien à voir avec la protection de code non plus. Les .h sont justes des fichiers pour les feignants/pour faire joli.
3: la protection de code consiste à utiliser un pointeur.
- Code: Tout sélectionner
A.cpp
struct B;
void doSomethingWithB(struct B*);
void test(){
struct B* b;
doSomethingWithB(b);
}
gcc -c A.cpp peut compiler.
- Code: Tout sélectionner
B.cpp
struct B{
int b1,b2,...;
}
void doSomethingWithB(struct B* b){
}
gcc -c B.cpp contient le code exécutable de B, B a évidemment accès à tous les internals de ...B
Lorsque tu es dans, A, tu n'as pas besoin de connaitre ce que contient struct B, tu as juste besoin de connaitre le nom des méthodes (uniquement leur déclaration).
Si tu utilises struct B (le type plein) alors le compilateur lit la définition de B, et tu as donc besoin d'avoir défini B dans A.
Mais si tu utilises struct B*, alors le compilateur trouves juste un pointeur et n'a pas besoin de la définition de B.
C'est seulement quand tu compileras ton programme que gcc appèleras le linker, et le linker dira pour A.o: utilises le code de doSomethingWithB qui se trouve dans B.
Conclusion:
Pour protéger tes internals.
Tu utilises un pointeur.
Dans ton fichier qui propose toutes les méthodes, tu as accès a ton type plein (et uniquement dans ce fichier).
Eventuellement, tu écris le prototype des méthodes avec une déclaration de ta structure dans un .h, par exemple
- Code: Tout sélectionner
B.h
struct B; //forward declaration
void doSomethingWithB(struct B* b);
A.cpp
#include "B.h"
void test(){
//...
}
Tu remarques que c'est exactement le même code qu'avec les déclration dans le cpp. (tu te rappèles qu'un include ne fait que copier le texte du .h à l'endroit ou ya écrit include)