Con i macro C/C++ è abbastanza semplice generare automaticamente lunghi costrutti. Ad esempio, se voglio un enorme insieme di metodi per non mai generare eccezioni (un must per i metodi COM-esposto) che posso fare qualcosa di simile:Come posso fare in modo che il preprocessore inserisca interruzioni di riga nel risultato di espansione macro?
#define BEGIN_COM_METHOD\
try{
#define END_COM_METHOD\
return S_OK;\
} catch(exception&) {\
// set IErrorInfo here\
return E_FAIL;\
}
di effettuare tali macro maneggevole può usare "\" carattere per rendere la definizione della macro multilinea e più leggibile.
Il problema è che a volte il codice con tali costrutti non verrà compilato - qualcosa non si espanderà come previsto e il codice non valido sarà presente nel compilatore. Generalmente il compilatore ha l'opzione "genera file preelaborato" per mostrare allo sviluppatore il risultato della preelaborazione. Ma nel file preelaborato la macro viene espansa in una riga e il risultato è appena leggibile.
È possibile eseguire il preprocessore per mantenere gli interruzioni di riga presenti nella definizione di macro?
Hai trovato uno dei casi in cui le macro non devono mai essere utilizzate. Il flusso di controllo offuscato è particolarmente brutto qui. –
@nobugz Sì, ma al momento disponiamo di 16.000 metodi esposti in COM e abbiamo bisogno di tracciamento dei parametri e di prova in ognuno di essi e tali campane e fischietti devono essere mantenibili. C++ non offre altro modo di fare ciò che usa le macro. – sharptooth