54 votes

Comment convertir le code C ++ en C

J'ai peu de code C++. Dans le code il y a beaucoup de classes définies, leurs fonctions membres, les constructeurs, destructeurs pour ces classes, quelques classes de modèle et beaucoup de C++ choses. Maintenant, j'ai besoin de convertir la source de la plaine du code C.

J'ai les questions suivantes:

  1. Est-il un outil pour convertir le code C++ et les fichiers d'en-tête pour le code C?

  2. Vais-je avoir à faire de la réécriture totale du code (je vais devoir supprimer les constructeurs,destructeurs et déplacer ce code dans certains init(), deinit() fonctions; classes de changement de structures, les fonctions de membre comme des pointeurs de fonction dans ces nouvelles structures définies et ensuite appeler ces fonctions à l'aide de pointeurs de fonction, etc..)?

  3. Si je dois le convertir manuellement moi-même, ce que le C++ le code spécifique de données de constructions/sémantique dois-je payer attention à tout en faisant la conversion du C++ à C?

33voto

MSalters Points 74024

Il existe en effet un tel outil, le compilateur C ++ de Comeau. . Il générera du code C que vous ne pouvez pas gérer manuellement, mais ce n'est pas un problème. Vous allez maintenir le code C ++ et simplement convertir en C à la volée.

24voto

plan9assembler Points 2209

http://llvm.org/docs/FAQ.html#translatecxx

PS: je ne l'ai pas utilisé du tout. Laissez-moi savoir si cela fonctionne.

5voto

Richard Points 54016

Bien que vous puissiez faire du OO en C (par exemple en ajoutant un paramètre theType *this premier aux méthodes, et en manipulant manuellement quelque chose comme vtables pour le polymorphisme), ceci n’est jamais particulièrement satisfaisant en tant que conception, et aura une apparence laide (même avec certains pré-processeurs).

Je suggérerais au moins de regarder une nouvelle conception pour comparer comment cela fonctionnerait.

Globalement, cela dépend beaucoup de la réponse à la question clé: si vous avez du code C ++ fonctionnel, pourquoi voulez-vous le C à la place?

5voto

niutech Points 5023

Peut-être que le bon vieux cfront fera l'affaire?

4voto

Gyll Points 121

Un compilateur est composé de deux grands blocs: le 'front end' et le 'back-end'. L'extrémité avant d'un compilateur analyse le code source et crée une certaine forme de 'intermédiaire de la représentation" du dit code source qui est beaucoup plus facile à analyser par un algorithme de machine qu'est le code source (c'est à dire alors que le code source par exemple C++ est conçu pour aider le programmeur humain à écrire du code, l'intermédiaire du formulaire est conçu pour vous aider à simplifier l' algorithme qui analyse dit intermédiaire forme plus facile). L'extrémité arrière d'un compilateur prend l'intermédiaire du formulaire, puis la convertit en une 'langue cible'.

Maintenant, la langue cible pour l'utilisation générale compilateurs assembleur langues pour différents processeurs, mais il n'y a rien à interdire à un compilateur pour produire du code dans un autre langage, aussi longtemps que a dit de la langue cible (au moins) aussi souple comme un général de l'UC de l'assembleur.

Maintenant, comme vous pouvez l'imaginer, C est certainement aussi souple qu'une CPU assembleur, tels que C++ le compilateur C est vraiment pas de problème à mettre en œuvre à partir d'une technique de pov.

Vous avez donc: C++ ---frontEnd---> someIntermediaryForm ---backEnd---> C

Vous voudrez peut-être vérifier ces gars: http://www.edg.com/index.php?location=c_frontend (le lien ci-dessus est fourni à titre purement informatif pour ce qui peut être fait, ils ont la licence de leurs extrémités avant pour des dizaines de milliers de dollars)

PS Autant que je sache, il n'existe pas de C++ le compilateur C de GNU, et ce totalement me bat (si je ne me trompe à ce sujet). Parce que le langage C est assez petite et il est de mécanismes internes sont assez rudimentaires, un compilateur C exige quelque chose comme un homme de l'année (je peux vous dire de première main de cause, j'ai écrit un tel compilateur moi mai il y a des années, et il produit un [virtuel] la pile de la machine intermédiaire de code), et être capable d'avoir une maintenu, jusqu'à la date de compilateur C++ tandis que seulement avoir à écrire un compilateur C une fois serait une grande chose à avoir...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X