Przy pomocy makr C/C++ generowanie długich konstrukcji jest dość łatwe. Na przykład, jeśli chcę ogromny zbiór metod nie zawsze generują wyjątki (pleśń dla metod COM narażonych) mogę zrobić coś takiego:W jaki sposób można włączyć przetwarzanie wstępne linii przerwań w wyniku makra?
#define BEGIN_COM_METHOD\
try{
#define END_COM_METHOD\
return S_OK;\
} catch(exception&) {\
// set IErrorInfo here\
return E_FAIL;\
}
aby takie makra zarządzaniu można użyć „\” znak, aby definicja makra była wielowierszowa i bardziej czytelna.
Problem polega czasem na tym, że kod z takimi konstrukcjami nie zostanie skompilowany - coś nie rozwinie się zgodnie z oczekiwaniami, a nieprawidłowy kod będzie obecny w kompilatorze. Kompilator zwykle ma opcję "generuj wstępnie przetworzony plik", aby pokazać programistom wynik przetwarzania wstępnego. Jednak w wstępnie przetworzonym pliku makro jest rozwijane do jednej linii, a wynik jest ledwo czytelny.
Czy można uruchomić preprocesor, aby zachować podział linii w definicji makra?
Znalazłeś jeden z przypadków, w których makra nigdy nie powinny być używane. Zakazany przepływ sterowania jest tutaj szczególnie nieprzyjemny. –
@nobugz Tak, ale obecnie mamy 1600 metod narażonych na działanie COM i potrzebujemy funkcji "try-catch" i śledzenia parametrów w każdym z nich, a te dzwonki i gwizdki muszą być możliwe do utrzymania. C++ nie oferuje innego sposobu robienia tego za pomocą makr. – sharptooth