2010-10-23 19 views
0

Je ne code pas avec lib liant et dll pour la plupart du temps, récemment quand je fais, je me suis rendu compte qu'il pourrait y avoir quelque chose de très mal avec la façon dont je fais #include.C# MSVS dll en-têtes #include problèmes

Est-ce que la méthode correcte/souhaitable est #include?

Supposons que j'ai 3 projets (1) dll_A (2) dll_B (3) exe_1. dll_A dépend de dll_B, exe_1 dépend d'un dll_A.

la façon dont je fais mon #include est comme suit:

dll_B.h ----> no dependency 
dll_B.cpp -----> #include dll_B.h 
dll_A.h -------> #include dll_B.h 
dll_A.cpp -------> #include dll_A.h 
exe_1.h --------> #include dll_A.h 

De là, on peut voir que exe_1.h comprend indirectement dll_b.h qui est un peu mauvais pour moi, parce que je veux exe_1. h pour être indépendant de dll_b.h ... encore, je ne suis pas sûr que ce soit possible car sinon comment exe_1 peut-il lier à dll_b?

EDIT: la dépendance à l'exemple

// dll_B.h 
struct dataB{}; 

// dll_A.h 
#include dll_B.h 
dataB* A_function_ptr(); // (any difference for implementing PIMPL?) 
dataB& A_function_ref(); 
dataB A_function_copy(); 

// exe_1.cpp 
#include dll_A.h 
// ... it seems naturally #include-sion of dll_B.h is necessary? Can it be avoided? 

Répondre

1

Si dll_B est juste un détail, puis de la mise en œuvre de dll-A, ne comprend pas [dll_B.h] de [dll_A.h], juste l'inclure de [dll_A .cpp]. Pour éviter cette dépendance d'en-tête, il peut être nécessaire de modifier légèrement la conception.

E.g. vous voudrez peut-être penser à PIMPL idiom pour [dll_A].

Plus de détails sont impossibles à l'autre sans le savoir plus de détails ... :-)

Vive & HTH,

PS:. Linking n'a rien à voir avec les fichiers d'en-tête, sauf que certains compilateurs de Windows (notamment MSVC) un fichier d'en-tête peut inclure un #pragma qui provoque une liaison automatique avec la bibliothèque correcte.

+0

Merci Alf, quand je dis lien je veux aussi dire être conscient des déclarations dans dll_B qui est utilisé dans dll_A. supposons que dll_B a une structure B_DATA qui est le type de retour pour A_function dans dll_A, alors est-ce aussi un mauvais design? – Jake