Presque tout le code OO C++ typique est juste une syntaxe snazzy autour de l'ancienne technique de création de bibliothèques qui créait un "cookie" et nécessitait qu'il soit transmis à chaque appel. Donc, si aucune des classes ont des méthodes virtuelles (pas d'expédition d'exécution), vous devriez être en mesure de faire ce qui suit:
- Pensez tous les noms de classe comme « installation » ou les noms « bibliothèque ».
- Mettez tous les membres de données de la classe dans une structure nommée classname (nom de la classe utilisé)
- Transformez toutes les méthodes en fonctions nommées classname_methodname.
- Ajoutez un pointeur au nom de classe struct à la liste de paramètres de toutes les fonctions (méthodes) de cette classe.
- Transformez les constructeurs en une fonction nommée classname_construct (# pour les surcharges peut-être) et le destructeur en une fonction nommée classname_destruct.
- Modifier tous les appels de méthode dans un autre code de
objectname.methodname (...)
à classname_methodname (objecname, ...)
.
- C'est la partie difficile: Vous devrez mettre du code pour appeler les destructeurs manuellement, puisque ceux-ci sont automagiquement appelés en C++.
Prenant l'exemple donné dans les commentaires:
class QtCommandData {
public:
QtCommandData(unsigned short net, unsigned short command,
unsigned long n_data_bytes, unsigned short flgs,
unsigned char* data = NULL);
QtCommandData();
~QtCommandData();
public:
unsigned char* m_pData;
int m_Async;
protected:
unsigned int m_nDataBytes;
unsigned int m_BytesAllocated;
protected:
int Fill_Trailer();
};
...Devient (j'abrège le « nom de l'installation » QtCommandData
-QtCD
):
typedef struct {
unsigned char* m_pData;
int m_Async;
unsigned int m_nDataBytes;
unsigned int m_BytesAllocated;
} QtCD;
QtCD_Construct(QtCD * handle,
unsigned short net, unsigned short command,
unsigned long n_data_bytes, unsigned short flgs,
unsigned char* data);
QtCD_Destruct(QtCD * handle);
QtCD_Fill_Trailer (QtCD * handle);
C'est l'idée générale. Les modèles et la répartition dynamique et quelques autres choses peuvent vous jeter un singe ou deux, mais je suis sûr que vous êtes prêt à relever le défi. :-)
Essayez-vous de trouver un outil capable de le faire * automatiquement *, ou essayez-vous de le faire manuellement? –
Essayez-vous d'écrire l'équivalent C ou essayez-vous d'accéder à la fonctionnalité C++ via une interface C. –
Vous en avez juste besoin pour compiler avec un compilateur C ou avez-vous besoin de code maintenable? Si c'est le premier, prenez [Comeau C++] (http://www.comeaucomputing.com). La dernière fois que j'ai regardé c'était 50 $ et il sort C, adapté à plusieurs compilateurs C, GCC parmi eux. – sbi