Il modo migliore per usare un api in stile C ++ da un file in stile C compilato in C ++

3

Sto lavorando in un'azienda di telecomunicazioni. Abbiamo alcuni strumenti di generazione del codice che generano file in stile C basati su una definizione MIB. Li compiliamo con C ++ però. Si riduce al fatto che questi file generati contengono solo un mucchio di funzioni vuote e che dobbiamo implementarle. Inutile dire che questa generazione di codice è una cosa sola: -)

Ora per il resto facciamo il nostro design in C ++ e usiamo l'iniezione di dipendenza e simili. Beh, almeno lo faccio ed è un po 'povero amico. Realizziamo tutto a mano e non utilizziamo un contenitore DI.

Il problema qui è che non importa quanto sia elegante il tuo design in C ++, come puoi chiamarlo da una tale funzione in stile C in modo aggraziato? Posso pensare a qualche meccanismo fuori dalla mia manica:

  • Utilizzare un singleton come rappresentazione per il design C ++, inteso come punto di ingresso dallo stile C alla funzionalità C ++
  • Utilizza un globale. Un po 'simile a quanto sopra perché un Singleton è davvero globale. Quindi non mi piacciono questi 2 approcci. Ho imparato ad avere un rapporto di amore / odio con Singletons. Ne vedo troppi ed evito di usarli io stesso.
  • Utilizzare un getter statico da qualche parte in una classe che come tale è un punto di ingresso per la funzionalità C ++. Questo è in realtà un tipo di accesso globale. Questo getter può fornire accesso ad una variabile statica con scope di file C ++, per esempio.
  • Usa un proxy che instanziati nel corpo della funzione per proxy l'altra funzionalità C ++. Ma questo semplicemente sposta il problema perché non si può ancora fare un'iniezione di dipendenza. Questo modo di pensare è più la direzione che penso di dover andare.

Si può presumere che la funzionalità C ++ sia già inizializzata nel momento in cui le funzioni in stile 'C' devono svolgere il proprio lavoro. La roba di iniezione delle dipendenze è già stata eseguita durante l'inizializzazione, quindi non penso che le funzioni in stile C dovrebbero preoccuparsene. Hanno solo bisogno di un punto di ingresso per l'API C ++.

Spero di essere stato in grado di rendermi un po 'chiaro; -)

    
posta Philip Stuyck 06.03.2016 - 21:36
fonte

1 risposta

4

Molti C api permettono che funzioni, includendo un puntatore di contesto. Questo è tipicamente di tipo void * e può indicare qualsiasi cosa. Semplicemente lanciato sul tipo appropriato e via.

Se il sistema su cui stai lavorando non include un puntatore di contesto, non hai altra scelta che mettere a disposizione un global. A questo punto, dico che la semplicità è la migliore, e dovresti semplicemente avere una variabile globale da qualche parte.

    
risposta data 06.03.2016 - 21:48
fonte

Leggi altre domande sui tag