Comment convertir le code C ++ en C

J’ai du code C ++. Dans le code, il y a beaucoup de classes définies, leurs fonctions membres, constructeurs, destructeurs pour ces classes, peu de classes de templates et beaucoup de choses en C ++. Maintenant, je dois convertir le code source en code C simple.

J’ai les questions suivantes:

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

  2. Devrais-je réécrire complètement le code (je deinit() supprimer les constructeurs, les destructeurs et déplacer ce code dans certaines fonctions init() , deinit() , changer les classes en structures, faire des fonctions membres existantes des pointeurs de fonctions dans les nouvelles structures définies puis invoquer ces fonctions en utilisant des pointeurs de fonctions, etc.)?

  3. Si je dois le convertir manuellement moi-même, à quoi dois-je faire attention lors de la conversion de C ++ en C?

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 maintiendrez le code C ++, et convertissez simplement en C à la volée.

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

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

Bien que vous puissiez faire OO en C (par exemple en ajoutant le theType *this à la méthode, et en manipulant manuellement quelque chose comme vtables pour le polymorphism), cela ne sera jamais particulièrement satisfaisant (même avec certains hacks pré-processeur). ).

Je suggérerais au moins d’examiner une nouvelle conception pour comparer la façon dont cela fonctionnerait.

Dans l’ensemble, beaucoup dépend de la réponse à la question clé: si vous utilisez du code C ++, pourquoi voulez-vous plutôt que C?

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

Un compilateur se compose de deux blocs principaux: le “front end” et le “back end”. Le frontal d’un compilateur parsing le code source et crée une forme de «représentation intermédiaire» dudit code source, qui est beaucoup plus facile à parsingr par un algorithme de machine que le code source (c.-à-d. aider le programmeur humain à écrire du code, le formulaire intermédiaire est conçu pour aider à simplifier l’ algorithme qui parsing plus facilement ladite forme intermédiaire). Le back-end d’un compilateur prend la forme intermédiaire puis la convertit en une «langue cible».

Maintenant, le langage cible pour les compilateurs à usage général sont des langages assembleur pour divers processeurs, mais rien n’empêche un backend de compilateur de produire du code dans une autre langue, tant que cette langue cible est (au moins) aussi flexible assembleur général d’UC.

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

Donc, vous avez: 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 juste informatif pour ce qui peut être fait, ils accordent des licences pour leurs dizaines de milliers de dollars )

PS Autant que je sache, il n’y a pas de tel compilateur C ++-to-C par GNU, et cela me bat totalement (si j’ai raison). Parce que le langage C est assez petit et que ses mécanismes internes sont assez rudimentaires, un compilateur C nécessite quelque chose comme un travail d’un an (je peux vous dire que j’ai écrit un compilateur il y a des années) code intermédiaire]], et être capable d’avoir un compilateur C ++ mis à jour tout en n’ayant à écrire qu’un compilateur C serait une bonne chose d’avoir …

Ceci est un ancien thread mais apparemment, le C++ Faq a une section (version archivée 2013) à ce sujet. Ceci sera apparemment mis à jour si l’auteur est contacté, ce sera probablement plus à jour sur le long terme, mais voici la version actuelle:

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 correspondent pas directement à C, plus le code C généré n’est pas destiné aux humains. Si vous voulez dire, y a-t-il des compilateurs qui convertissent C ++ en C afin de les comstackr sur une plate-forme qui ne possède pas encore de compilateur C ++? alors vous avez de la chance – continuez à lire.

Un compilateur qui comstack C ++ en C effectue une vérification complète de la syntaxe et de la sémantique sur le programme, et il arrive juste d’utiliser le code C pour générer du code object. Un tel compilateur n’est pas simplement une sorte de macro-processeur sophistiqué. (Et s’il vous plaît, ne m’envoyez pas un courrier électronique prétendant que ce sont des préprocesseurs – ce ne sont pas des compilateurs complets.) Il est possible d’implémenter toutes les fonctionnalités de la norme ISO C ++ par traduction en C en code object avec une efficacité comparable à celle du code généré par un compilateur C ++ conventionnel.

Voici quelques produits qui effectuent une compilation en C:

  • Comeau Computing propose un compilateur basé sur le front-end 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 de C ++ en C via LLVM .
  • Cfront , l’implémentation originale de C ++, réalisée par Bjarne Stroustrup et d’autres chez AT & T, génère du code C. Cependant, il y a deux problèmes: il a été difficile d’obtenir une licence depuis le milieu des années 90 alors qu’il commençait à passer par un labyrinthe de changements de propriété et le développement a cessé au même moment. des nouvelles fonctionnalités linguistiques (par exemple, exceptions, espaces de noms, RTTI, modèles de membres).

  • Contrairement au mythe populaire, à ce jour, aucune version de g ++ ne traduit C ++ en C. Une telle chose semble réalisable, 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 pour que le code C généré soit spécifiquement ciblé pour cette plate-forme. Cela signifie que: (a) vous ne pouvez probablement pas prendre le code C généré pour la plate-forme X et le comstackr sur la plate-forme 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.

Une fois de plus: ne m’envoyez pas d’email en disant que ce ne sont que des préprocesseurs – ils ne le sont pas – ce sont des compilateurs.