2010-01-22 14 views
7

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?

+1

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. –

+2

@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

Odpowiedz

6

Nie możesz tego zrobić. Tekst zastępczy trwa do końca wiersza, w którym jest #define d, więc nie będzie zawierał znaków nowej linii. Jeśli twoje problemy z kompilacją są rzadkie, możesz uruchomić wstępnie przetworzony plik przez indent lub coś podobnego przed kompilacją, aby uzyskać bardziej czytelny kod.

Powiązane problemy