2010-06-17 40 views
5

Idealnie chciałbym móc dodać (bardzo powtarzalny) kod C/C++ do mojego rzeczywistego kodu, ale w czasie kompilacji, kod, który pochodziłby od powiedzenia, stdouta pytona skrypt, tak samo jak w przypadku makr.Generowanie kodu podczas kompilacji przy użyciu skryptów

Na przykład, powiedzmy, że chcę mieć funkcji, które zależą od cech publicznych danej klasy, będąc w stanie po prostu napisać następujących w moim kodu C++ byłby błogosławieństwem:

generate_boring_functions(FooBarClass,"FooBarClass.cpp") 

Czy wykonalne przy użyciu konwencjonalnych środków? Czy muszę włamać się z Makefile i tymczasowymi plikami źródłowymi?

Dzięki.

+0

Myślałem, że Makefile były konwencjonalnymi środkami. Co miałeś na myśli? –

+1

Jakie są nudne funkcje? Czy jest to coś, co można rozwiązać za pomocą rozwiązania opartego na szablonach? –

+0

Nie jest to szablon, który można rozwiązać, i wiem, że Makefile są konwencjonalnymi metodami, ale ja po prostu miałem na myśli coś, co zadziałałoby po prostu przez zrobienie tego głupiego prostego "g ++ foo.cpp -o foo", myślę, że to za dużo do zrobienia;) – Manux

Odpowiedz

3

Najprawdopodobniej trzeba zmodyfikować plik Makefile. Łatwo byłoby napisać skrypt (Python), który odczytuje każdy z plików źródłowych jako dodatkowy etap przetwarzania wstępnego, zastępując instancje generate_boring_functions (lub dowolnego innego makra skryptu) poprawnym kodem, potencjalnie po prostu wywołując generate_boring_functions.py z właściwymi argumentami i pomijanie potrzeby plików tymczasowych poprzez wysłanie źródła do kompilatora za pomocą standardowego wejścia.

Cholera, teraz chcę zrobić coś takiego.

Edytuj: Taka reguła, utknięta w pliku makefile, może być użyta do obsługi dodatkowego etapu kompilacji. To jest niesprawdzone i dodane tylko do niektórych ujęć w zupełności.

+0

Jak wysłać źródło do kompilatora przez stdin (nie używając plików tymczasowych)? – Manux

+0

Oy, http://stackoverflow.com/questions/2083874/compile-string-of-c-code – Manux

+0

@Manux: To podejście działałoby tylko z jednym plikiem źródłowym na raz ... –

2

Makefile (lub odpowiednik) to "konwencjonalny" oznacza!

0

Możesz wypróbować bibliotekę Preprocessor do Boost. To tylko przedłużenie zwykłego preprocesora, ale jeśli jesteś kreatywny, możesz osiągnąć prawie wszystko.

3

Jeśli plik Makefile nie jest dla ciebie wystarczająco konwencjonalny, możesz uzyskać dzięki sprytnie napisanym makrom.

class FooBarClass 
{ 
    DEFINE_BORING_METHODS(FooBarClass) 

    /* interesting functions begin here */ 
} 

Bardzo często widzę, że robi się to, aby zaimplementować części tablicy z klasami COM.

Ale jeśli chcesz coś, co nie jest ani make ani makro, to nie wiem, co możesz mieć na myśli.

+0

+1 makra w celu uproszczenia kodu standardowego. –

0

Czy obejrzałeś PythoidC? Może służyć do generowania kodu C.

2

Nigdy nie używałem tej konkretnej technologii, ale wygląda na to, że szukasz czegoś takiego jak narzędzie o nazwie Ned Batchelder's Cog.

Skrypty w języku Python są osadzane w źródłowym pliku C++, dzięki czemu po uruchomieniu narzędzia cog generowany jest dodatkowy kod C++, który można wykorzystać do kompilacji C++. Zatem twój proces kompilacji składałby się z dodatkowego kroku, aby cog wygenerował rzeczywisty plik źródłowy C++, zanim zostanie wywołany kompilator C++.

Powiązane problemy