2010-01-22 16 views
7

Con macros C/C++ es bastante fácil generar construcciones largas automáticamente. Por ejemplo, si quiero un enorme conjunto de métodos que no siempre lanzar excepciones (una necesidad para los métodos COM-expuesta) que pueda hacer algo como esto:¿Cómo puedo hacer que el preprocesador inserte saltos de línea en el resultado de la expansión de macros?

#define BEGIN_COM_METHOD\ 
    try{ 

#define END_COM_METHOD\ 
    return S_OK;\ 
    } catch(exception&) {\ 
     // set IErrorInfo here\ 
     return E_FAIL;\ 
    } 

para hacer este tipo de macros manejable pueden utilizar "\" carácter para hacer la definición de macro de líneas múltiples y más legible.

El problema es que algunas veces el código con dichas construcciones no se compilará, algo no se expandirá como se espera y el código no válido estará presente en el compilador. El compilador generalmente tiene la opción "generar archivo preprocesado" para mostrar al desarrollador el resultado del preprocesamiento. Pero en el archivo preprocesado, la macro se expande en una línea y el resultado es apenas legible.

¿Es posible hacer que el preprocesador mantenga los saltos de línea presentes en la definición de macro?

+1

Has encontrado uno de los casos donde las macros nunca deben ser usadas. El flujo de control ofuscado es particularmente desagradable aquí. –

+2

@nobugz Sí, pero actualmente tenemos 1600 métodos expuestos a COM y necesitamos un rastreo de prueba y de parámetros en cada uno de ellos y esas campanas y silbidos deben ser mantenibles. C++ no ofrece otra forma de hacer eso usando macros. – sharptooth

Respuesta

6

No puede hacerlo. El texto de reemplazo es hasta el final de la línea donde está #define d, por lo que no tendrá líneas nuevas. Si sus problemas con la compilación son poco frecuentes, puede ejecutar el archivo preprocesado a través del indent o algo así antes de compilar cuando eso le ayude a obtener un código más legible.

Cuestiones relacionadas