2010-09-09 10 views
-4

J'ai besoin d'écrire mon fichier 4-5 .cpp et .h en code c. Dans le code C++, nous avons défini une classe, un constructeur, un destructeur, une fonction.Besoin d'écrire du code C à partir du code C++?

Comment les convertir en code C? Quelqu'un peut-il m'en donner un exemple afin que je puisse l'implémenter ou fournir un lien pour que je puisse mieux l'explorer avec mon code C? Comment implémenter toutes les fonctionnalités je veux dire constructeur, destructeur, fonctions de classe en C?

+0

Essayez-vous de trouver un outil capable de le faire * automatiquement *, ou essayez-vous de le faire manuellement? –

+2

Essayez-vous d'écrire l'équivalent C ou essayez-vous d'accéder à la fonctionnalité C++ via une interface C. –

+3

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

Répondre

13
  1. convertir toutes les classes de structures de données()
  2. définitions de types
  3. remplacent les constructeurs et destructeurs avec des fonctions qui utilisent malloc/calloc et libre et retour/prendre des pointeurs à vos structures typedef
  4. éliminer polymorphisme; si cela est impossible de mettre en œuvre alors une fonction de message de répartition pour chaque typedef (une déclaration big switch) et représentent des messages comme des entiers constants
  5. modifier toutes les fonctions de prendre un pointeur sur le typedef approprié

Notez que typedefs ne supporte pas le sous-typage, donc tout l'héritage devra être converti en composition.

+4

A propos du point 3, vous pouvez aussi construire "manuellement" un vtable, initialisé par les faux constructeurs. –

+1

Sur le point 2: Les constructeurs/destructeurs n'ont rien à voir avec l'allocation/désallocation, mais avec l'initialisation et la finalisation. Cela devrait probablement être: 2.0) convertir les constructeurs et les destructeurs en fonctions d'initialisation et de finalisation 2.1) convertir tout nouveau en fonction malloc + appel en fonction d'initialisation, 2.2) convertir tout supprimer en appel en fonction de finalisation + gratuit, 2.3) s'assurer que la fonction de finalisation avant que les objets ne sortent de la portée de toutes les classes possédant des destructeurs non triviaux –

+0

Qui convertit réellement tous les constructeurs en constructeurs de placement. –

5

Il y a beaucoup de considérations et des choses qui doivent changer, mais je pense que ce que vous voulez faire est d'émuler du code orienté objet dans C.

Fondamentalement pour chacune de vos classes, vous devez prendre les fonctions et ne laissez que les membres de données dans la classe/struct (vous renommez class to struct et supprimez les spécificateurs public/private/protected).

Ensuite, vous devez ajouter un premier paramètre à chacune de ces fonctions qui est un pointeur vers la structure sur laquelle opérer.

+0

Pouvez-vous s'il vous plaît me donner un exemple? –

+2

Pour quoi exactement avez-vous besoin d'un exemple? La tâche décrite dans cette réponse est simple si vous connaissez déjà C++. –

3

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. :-)

+0

j'ai classe suivant pouvez-vous me dire comment faire cela? –

+0

classe QtCommandData { public: QtCommandData (court non signé net, commande court non signé, n_data_bytes unsigned long, FLGS court non signé, données non signé char * = NULL); QtCommandData(); ~ QtCommandData(); public: unsigned char * m_pData; int m_Async; protégé: unsigned int m_nDataBytes; unsigned int m_BytesAllocated; protégé: int Fill_Trailer(); }; –

2

Pour les fonctions dont vous avez besoin aussi d'empêcher le compilateur C++ de nom mutiler si vous souhaitez associer une bibliothèque C++ à un programme C, vous ajoutez des blocs dans vos têtes comme

#ifdef __cplusplus 
extern "C" { 
#endif 

/* Some functions here */ 

#ifdef __cplusplus 
} 
#endif 
+0

Je ne pense pas que l'appel du code C à partir de C++ était ce qu'il demandait. – Clifford

0

C ne pas directement soutenir le paradigme POO. Traduire un dessin OO ou un code en C est un processus mécanique assez simple mais pas un processus qui ne pourrait raisonnablement pas être complètement couvert ici peut-être. Il y a déjà au moins un fil sur le sujet: Can you write object-oriented code in C? avec des liens vers des ressources.

Si votre code utilise les fonctionnalités C++ plus complexes telles que la programmation générique, le polymorphisme et l'héritage multiple, votre travail peut être plus difficile que cela en vaut la peine. Cependant C et C++ peuvent interopérer assez facilement. Pourquoi ne pas simplement fournir un wrapper C autour de vos classes C?

Questions connexes