2009-04-10 62 views
42

Tengo un código C++. En el código hay muchas clases definidas, sus funciones miembro, constructores, destructores para esas clases, pocas clases de plantillas y muchas cosas de C++. Ahora necesito convertir la fuente al código C simple.Cómo convertir código C++ a C

que las siguientes preguntas: tener

  1. ¿Hay alguna herramienta para convertir los archivos de código C++ y la cabecera de código C?

  2. Voy a tener que hacer reescritura total del código (voy a tener que quitar los constructores, destructores y mover ese código en algunos init(), deinit() funciones; clases de cambio de estructuras, realizar funciones miembro existentes como punteros a funciones en los estructuras recién definidas y luego invocar esas funciones usando punteros a funciones, etc.)?

  3. Si tengo que convertirlo manualmente, ¿a qué construcciones/datos de código de C++ específicos debo prestarle atención al hacer la conversión de C++ a C?

Respuesta

29

De hecho existe una herramienta de este tipo, el compilador C++ de Comeau. . Generará código C que no puede mantener manualmente, pero eso no es problema. Mantendrás el código C++ y simplemente convertirás a C sobre la marcha.

+0

@MSalters: Gracias por el puntero sobre el compilador Comeaus. Pero lamentablemente eso no cumple mi propósito, ya que no es posible obtener el código c de formato intermedio del compilador de Comeaus, e incluso si obtenemos de alguna forma que no es compilable por los compiladores ANSI-C normales. – goldenmean

+2

Si su código no usa excepciones y plantillas, es posible que tenga la oportunidad de obtener una copia anterior de cfront para que funcione en su código. Pero como MSalters dijo que iba a ser feo :-) – lothar

+0

tampoco tendría que usar ninguna funcionalidad de biblioteca estándar –

6

Si bien puede hacer OO en C (por ejemplo, agregando un primer parámetro theType *this a los métodos, y manejando manualmente algo como vtables para polimorfismo) esto nunca es particularmente satisfactorio como diseño, y se verá feo (incluso con algunos hacks de procesador).

Sugeriría al menos mirar un rediseño para comparar cómo esto funcionaría.

En general, mucho depende de la respuesta a la pregunta clave: si tiene código C++ en funcionamiento, ¿por qué quiere C en su lugar?

+5

Las razones del autor son obviamente específicas de la situación, pero existen razones. A veces, un compilador de C++ no existe en una plataforma en particular, o simplemente podría no estar disponible por alguna razón. También sirve como una excelente herramienta de aprendizaje. – TechZilla

17

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

PS: No he utilizado en absoluto. Déjame saber si funciona.

+0

@ plan9assembler: gracias por el puntero. Lo verificaré y te lo haré saber. – goldenmean

+1

He intentado convertir hello_world.cpp en un archivo C utilizando LLVM. El código C resultante es tan feo como el código de máquina. Las inclusiones del preprocesador se han ido. – MikimotoH

+1

@MikimotoH, se ve de esa manera porque no es una sintaxis para traducir la fuente de sintaxis. Es realmente un compilador que puede dar salida a c, lo que significa que todavía dependes de cualquier biblioteca de C++ vinculada. Es realmente mejor utilizado para la depuración, o como material de visualización. Por cierto: feo, puede ser, pero créanme que es mejor que el código de máquina y al menos podrían aprender de él. Puede aprender mejor de clang C++ a c, que cualquier desmontaje. – TechZilla

5

Tal vez bueno ol 'cfront hará?

+3

Hasta donde yo sé, cfront no se ha mantenido en mucho tiempo y es poco probable que maneje el código C++ moderno. –

4

Un compilador consta de dos bloques principales: el 'front-end' y el 'back-end'. El front-end de un compilador analiza el código fuente y construye alguna forma de 'representación intermediaria' de dicho código fuente que es mucho más fácil de analizar mediante un algoritmo de máquina que el código fuente (es decir, mientras que el código fuente para ayudar al programador humano a escribir el código, el formulario intermedio está diseñado para ayudar a simplificar el algoritmo que analiza dicha forma intermediaria más fácil). El back-end de un compilador toma el formulario intermediario y luego lo convierte en un "idioma de destino".

Ahora, el lenguaje de destino para compiladores de uso general son lenguajes de ensamblador para varios procesadores, pero no hay nada que prohíba a un compilador realizar código en otro idioma, siempre que dicho idioma de destino sea (al menos) tan flexible como un ensamblador general de CPU.

Ahora, como se puede imaginar, C es definitivamente tan flexible como el ensamblador de una CPU, de modo que un compilador de C++ a C realmente no es un problema para implementar desde un punto de vista técnico.

Así que tienes: C++ --- --- frontend> someIntermediaryForm --- --- backend> C

Es posible que desee comprobar estos chicos: http://www.edg.com/index.php?location=c_frontend (el enlace anterior es sólo informativo para lo puede se haga, que la licencia de sus extremos frontales para decenas de miles de dólares)

PS por lo que yo sé, no hay una C tal ++ para el compilador C de GNU, y esto me pega por completo (si estoy en lo cierto acerca de esto). Como el lenguaje C es bastante pequeño y sus mecanismos internos son bastante rudimentarios, un compilador de C requiere algo así como un trabajo de un año-hombre (puedo decirte esto de primera mano porque escribí tal compilador hace años, y produce un [compilador]). virtual] stack intermediate code), y poder tener un compilador C++ mantenido y actualizado, mientras que solo tener que escribir un compilador de C una vez sería una gran cosa tener ...

+0

el idioma de destino para los compiladores de uso general son los lenguajes de ensamblador (o el código de máquina ??) para varios procesadores – qPCR4vir

2

This is an old hilo, pero aparentemente el C++ Faq tiene un section en esto. Aparentemente, esto se actualizará si se contacta al autor, por lo que probablemente sea más actualizado a largo plazo.