2009-11-27 16 views
6

Ambos Macro expansión & Generación de código tienen pros & cons. ¿Cuál es tu enfoque favorito y por qué? ¿Cuándo deberíamos elegir uno sobre el otro? Por favor, amablemente asesorar. ¡Gracias!C/C++ Expansión de macro vs. Generación de código

expansión de la macro puede ser muy útil & útil: http://dtemplatelib.sourceforge.net/table.htm

vs

Mientras que la generación de código le da un montón de código agradable: http://code.google.com/p/protobuf/ http://incubator.apache.org/thrift/

Respuesta

2

Es una solución de compromiso. Déjame dar un ejemplo. Me encontré con la técnica de differential execution alrededor de 1985, y creo que es una herramienta realmente buena para programar interfaces de usuario. Básicamente, se necesitan programas sencillos estructurados como este:

void Foo(..args..){ 
    x = y; 
    if (..some test..){ 
    Bar(arg1, ...) 
    } 
    while(..another test..){ 
    ... 
    } 
    ... 
} 

y mucks con la estructura de control de la siguiente manera:

void deFoo(..args..){ 
    if (mode & 1){x = y;} 
    {int svmode = mode; if (deIf(..some test..)){ 
    deBar(((mode & 1) arg1 : 0), ...) 
    } mode = svmode;} 
    {int svmode = mode; while(deIf(..another test..)){ 
    ... 
    } mode = svmode;} 
    ... 
} 

Ahora, una muy buena manera de hacer eso habría sido escribir un analizador de C o cualquiera que sea el idioma base, y luego recorra el árbol de análisis, generando el código que quiero. (Cuando lo hice en Lisp, esa parte fue fácil.)

¿Pero quién quiere escribir un analizador para C, C++ o lo que sea?

Así, en lugar, acabo de escribir macros para que pueda escribir el código como el siguiente:

void deFoo(..args..){ 
    PROTECT(x = y); 
    IF(..some test..) 
    deBar(PROTECT(arg1), ...) 
    END 
    WHILE(..another test..) 
    ... 
    END 
    ... 
} 

Sin embargo, cuando hago esto en C#, alguien en su sabiduría decidió macros eran malos, y Don No quiero escribir un analizador C#, así que tengo que hacer la generación de código a mano. Es un dolor real, pero aún vale la pena en comparación con la forma habitual de codificar estas cosas.

+0

+1 gracias Mike. Esa es la mejor respuesta :) – Viet

5

en C o C++, la expansión de macros es notoriamente difícil de depurar. Por otro lado, escribir un generador de código es más fácil de depurar porque es un programa separado en sí mismo.

Sin embargo, debe tener en cuenta que esto es simplemente una limitación del preprocesador C. Por ejemplo, en la familia de idiomas Lisp, la macro expansión es generación de código, son exactamente lo mismo. Para escribir una macro, se escribe un programa (en Lisp) para transformar la entrada de S-expression en otra expresión S, que luego se pasa al compilador.

+0

Gracias por su respuesta, Greg. Se necesita más tiempo para escribir un generador de código decente y las macros se ven como un truco rápido para hacer las cosas. – Viet

+0

++ Mis sentimientos exactamente. Sería bueno si hubiera una manera de pasar por el preprocesamiento. Aun así, prefiero las macros si la generación de código es lo suficientemente simple. –

9

Para C++ prefiero la metaprogramación de plantillas o la generación de código sobre macros, pero las macros aún tienen sus aplicaciones.

El ejemplo que ha dado con dbtemplatelib se podría cubrir con C++ 0x Variadic Templates, con beneficios adicionales como el tipo de cheques, etc.

+0

Gracias por su sugerencia. Las plantillas también tienen sus virtudes. Existen macros variables, pero las plantillas variadas aún no se han popularizado, ya que C++ 0x todavía es nuevo. – Viet

+0

Bueno, para ser exactos, aún no está listo, y será un "C++ 1x". Pero las plantillas variadic se implementan en algunos compiladores, por ejemplo, para usarlos con gcc, debe agregar "-std = C++ 0x" como un modificador de compilador. – hirschhornsalz

3

Ambos tienen sus problemas. A diferencia de las macros, la generación de código puede producir código legible y depurable (¿es eso una palabra?), Pero es menos flexible y más difícil de cambiar.

+0

+1. gracias por responder. – Viet

Cuestiones relacionadas