web-dev-qa-db-fra.com

Comment convertir du code C ++ en C

J'ai du code C++. Dans le code, il existe de nombreuses classes définies, leurs fonctions membres, constructeurs, destructeurs pour ces classes, quelques classes de modèle et beaucoup de choses C++. Maintenant, je dois convertir la source en code C simple.

J'ai les questions suivantes:

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

  2. Dois-je faire une réécriture totale du code (je devrai supprimer les constructeurs, les destructeurs et déplacer ce code dans certaines fonctions init(), deinit(); changer les classes en structures, rendre existantes les fonctions membres en tant que pointeurs de fonction dans ces structures nouvellement définies, puis invoquer ces fonctions à l'aide de pointeurs de fonction, etc.)?

  3. Si je dois le convertir moi-même manuellement, à quelles constructions/sémantiques de données de code spécifiques C++ dois-je faire attention lors de la conversion de C++ en C?

46
goldenmean

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

32
MSalters

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

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

16
plan9assembler

Alors que vous pouvez faire OO en C (par exemple en ajoutant un theType *this premier paramètre des méthodes, et manipulation manuelle de quelque chose comme vtables pour le polymorphisme) ce n'est jamais particulièrement satisfaisant en tant que conception, et aura l'air moche (même avec certains hacks pré-processeur).

Je suggérerais au moins d'envisager une refonte 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 plutôt C?

6
Richard

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

5
niutech

Un compilateur se compose de deux blocs principaux: le "front end" et le "back end". La partie frontale d'un compilateur analyse le code source et construit une certaine forme de "représentation intermédiaire" dudit code source qui est beaucoup plus facile à analyser par un algorithme machine que le code source (c'est-à-dire que le code source, par exemple C++ est conçu pour aider le programmeur humain à écrire du code, le formulaire intermédiaire est conçu pour aider à simplifier l'algorithme qui analyse plus facilement ladite forme intermédiaire). Le back-end d'un compilateur prend la forme intermédiaire puis le convertit en un "langage cible".

Maintenant, le langage cible pour les compilateurs à usage général sont des langages d'assembleur pour divers processeurs, mais rien n'interdit à un serveur principal du compilateur de produire du code dans un autre langage, tant que ce langage cible est (au moins) aussi flexible qu'un assembleur général de CPU.

Maintenant, comme vous pouvez probablement l'imaginer, C est certainement aussi flexible que l'assembleur d'un CPU, de sorte qu'un compilateur C++ vers C n'est vraiment pas un problème à implémenter à partir d'un pov technique.

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

Vous voudrez peut-être vérifier ces gars-là: http://www.edg.com/index.php?location=c_frontend (le lien ci-dessus est juste informatif pour quoi peut être fait, ils concèdent sous licence leurs frontaux pour des dizaines de milliers de dollars)

PS Pour autant que je sache, il n'y a pas un tel compilateur C++ vers C par GNU, et cela me bat totalement (si j'ai raison à ce sujet). Parce que le langage C est assez petit et ses mécanismes internes sont assez rudimentaires, un compilateur C nécessite quelque chose comme un travail d'une année-homme (je peux vous dire cette première main parce que j'ai écrit un tel compilateur moi-même il y a peut-être des années, et il produit un [ virtual] stack machine intermediary code), et pouvoir avoir un compilateur C++ maintenu et à jour tout en n'ayant à écrire un compilateur C qu'une seule fois serait une bonne chose à avoir ...

4
Gyll

C'est un vieux fil mais apparemment le C++ Faq a un section(version archivée 2013) à ce sujet. Cela sera apparemment mis à jour si l'auteur est contacté, donc ce sera probablement plus à jour à long terme, mais voici la version actuelle:

Cela dépend de ce que vous voulez dire. Si vous voulez dire, est-il possible de convertir C++ en code C lisible et maintenable? alors désolé, la réponse est non - les fonctionnalités C++ ne sont pas directement mappées en C, de plus le code C généré n'est pas destiné aux humains. Si au contraire vous voulez dire, existe-t-il des compilateurs qui convertissent C++ en C dans le but de compiler sur une plate-forme qui n'a pas encore de compilateur C++? alors vous avez de la chance - continuez à lire.

Un compilateur qui compile C++ en C effectue une vérification complète de la syntaxe et de la sémantique sur le programme, et arrive à utiliser le code C comme un moyen de générer du code objet. Un tel compilateur n'est pas simplement une sorte de macro processeur sophistiqué. (Et veuillez ne pas m'envoyer d'e-mail en prétendant qu'il s'agit de préprocesseurs - ils ne le sont pas - ce sont des compilateurs complets.) Il est possible d'implémenter toutes les fonctionnalités de la norme ISO C++ par traduction en C, et à l'exception de la gestion des exceptions, il en résulte généralement en code objet avec une efficacité comparable à celle du code généré par un compilateur C++ conventionnel.

Voici quelques produits qui effectuent la compilation en C:

  • Comeau Computing propose un compilateur basé sur frontal d'Edison Design Group qui génère du code C.
  • LLVM est un compilateur téléchargeable qui émet du code C. Voir aussi ici et ici . Voici un exemple de conversion C++ en C via LLVM .
  • Cfront , l'implémentation originale de C++, réalisée par Bjarne Stroustrup et d'autres collaborateurs d'AT & T, génère du code C. Cependant, il a deux problèmes: il a été difficile d'obtenir une licence depuis le milieu des années 90, quand il a commencé à traverser un labyrinthe de changements de propriétaire, et le développement a cessé en même temps et donc il ne reçoit pas de correctifs de bogues et ne prend en charge aucun des nouvelles fonctionnalités linguistiques (par exemple, exceptions, espaces de noms, RTTI, modèles de membre).

  • Contrairement au mythe populaire, à ce jour, il n'y a pas de version de g ++ qui traduise C++ en C. Une telle chose semble être faisable, mais je ne suis pas au courant que quelqu'un l'ait fait (encore).

Notez que vous devez généralement spécifier le processeur, le système d'exploitation et le compilateur C de la plate-forme cible afin que le code C généré soit spécifiquement ciblé pour cette plate-forme. Cela signifie: (a) vous ne pouvez probablement pas prendre le code C généré pour la plateforme X et le compiler sur la plateforme Y; et (b) il sera difficile de faire la traduction vous-même - ce sera probablement beaucoup moins cher/plus sûr avec l'un de ces outils.

Encore une fois: ne m'écrivez pas en disant que ce ne sont que des préprocesseurs - ils ne le sont pas - ce sont des compilateurs.

2
Shafik Yaghmour