Dato che sono principalmente un ingegnere elettrico, perdonami se ho qualche terminologia.
Attualmente sto programmando un driver di visualizzazione / modulo di interfaccia. E come tante altre volte, ho raggiunto un punto in cui non sono sicuro su come separare i prototipi di funzioni e definizioni che sono intese per uso interno del modulo dall'interfaccia pubblica .
Considera il seguente codice come esempio:
C-file:
// display.c
#include "display.h"
// Belongs to public Interface
void SetFont(Font_t fnt) {
// implementation
}
// Belongs to public Interface
void PrintCharAt(int x, int y, char ch) {
// implementation
}
// For internal use only
void SendDataToDisplay(DisplayTelegram_t telegram) {
}
intestazione:
// display.h
typedef struct {
// implementation
} Font_t;
typedef struct {
// implementation
} DisplayTelegram_t;
void SetFont(Font_t fnt);
void PrintCharAt(int x, int y, char ch);
void SendDataToDisplay(DisplayTelegram_t telegram);
L'articolo Che cosa appartiene a un file di intestazione C? h? copre diversi punti con i quali sono maggiormente d'accordo.
DO include in the header file all of the function prototypes for the public interface of the module it describes.
DON’T include in the header file any other function or macro that may lie inside the module source code. It is desirable to hide these internal “helper” functions inside the implementation. If it’s not called from any other module, hide it!
Fin qui tutto bene, ma qual è la migliore pratica per nascondere i prototipi interni ecc? Non c'è motivo di avere il tipo DisplayTelegram_t
e il prototipo SendDataToDisplay()
nell'intestazione. Potrebbe anche confondere qualcuno che vuole solo utilizzare l'interfaccia quando le cose diventano più complesse.
Posso pensare a tre opzioni:
-
Basta mettere tutti i prototipi interni, typedef, definisce ecc. in cima al file .c. L'ho fatto in passato, ma non mi piace. Non sembra coerente inquinare il file .c con il materiale dell'intestazione.
-
Crea un secondo file di intestazione come
display_internal.h
e metti tutto lì solo per uso interno. Ho letto molto su questo approccio, ma l'ho visto a malapena. -
Non preoccuparti di nascondere i prototipi interni ecc. e basta mettere tutto nel file di intestazione. Magari raggruppando rispettivamente le cose pubbliche e quelle interne e lasciando un commento. Questo è sporco dal punto di vista della responsabilità, ma almeno è coerente e pulito per l'autore del codice.
C'è qualche approccio che mi manca? Come viene gestito a livello professionale?