2009-09-10 13 views
25

Mam paczkę plików nagłówkowych C++ z różnymi deklaracjami klasy i funkcji. Do tej pory, gdy piszę implementacje plików źródłowych w C++ zadeklarowanych klas i funkcji, byłem ręcznie:Automatycznie generuj plik C++ z nagłówka?

  1. Kopiowanie deklaracji z pliku nagłówkowego do odpowiedniego pliku źródłowego.
  2. Usuwanie "class classname {" i pasującego "};"
  3. Dodanie "classname ::" do nazw wszystkich funkcji klas.
  4. Zamawianie średników po deklaracjach funkcji za pomocą "{}".
  5. Usuwanie słów kluczowych "wirtualny" i "statyczny".

Dopiero po całej tej pracy, która tak naprawdę nic nie robi, mogę właściwie wdrożyć funkcje. Zastanawiam się, czy istnieje jakieś narzędzie, które może automatycznie wygenerować plik ".cpp" z pliku ".h", gdzie powstały ".cpp" zawiera pusty skrót dla funkcji zadeklarowanych w pliku ".h" (i dla których nie podano definicji śródliniowej). Preferowane byłoby narzędzie wiersza poleceń przyjazne dla systemu UNIX. Dzięki.

AKTUALIZACJA: Idealne byłoby narzędzie wieloplatformowe. Jeśli nie, pracuję na Mac OS X 10.6.

Odpowiedz

21

Lazy C++ wydaje się być zaprojektowany, aby dokładnie rozwiązać ten problem.

+0

Lazy C++ nie wydaje się być instalowalny na Mac OS X ... którego używam. Czy istnieją międzyplatformowe generatory, o których wiesz, że można je łatwo zbudować ze źródła? –

+1

+1 Bardzo interesujący zasób. –

+1

@Michael: Możesz pobrać źródło i przeprowadzić kompilację krzyżową dla OSX, zobacz np. odpowiedź na http: // stackoverflow.com/questions/1375201/lazy-c-chicken-and-egg-problem – moonshadow

3

Urządzenie eclipse CDT ma funkcję "Metoda realizacji", która właśnie to robi (jedna metoda na raz). Istnieje również funkcja "Generuj Getters and Setters", która generuje również odpowiedni kod w ciałach funkcji.

+0

Dzięki. Szukam wywołania komendy, ale ... coś, czego mogę użyć w poleceniu "znajdź" do rekurencyjnego generowania plików ".cpp" dla wszystkich plików nagłówkowych w moim projekcie. –

5

Ostatnio znalazłem się w twojej sytuacji i przygotowałem się do napisania własnego narzędzia - impl_me. Jest to mały skrypt w języku Ruby, który używa SWIG jako zaplecza parsera. Zapisuje się na standardowe wyjście, dzięki czemu możesz łączyć się ze swoim ulubionym zestawem narzędzi nix, aby poprawić własne preferencje.

Ponieważ jest napisany w języku Ruby, powinna być platformą krzyżową. SWIG ma także wiele platform, więc wszystko powinno być w porządku.

Jest dość prymitywny na tym etapie i nie jest tak solidny jak Lazy C++ pod względem analizowania dziwnych szablonów i innych rzeczy. Składki są mile widziane :)

0

Próbowałem Lazy C++, ale wydaje się być nieaktualny i nie jest już utrzymywany. Nie obsługuje też najnowszego standardu C++ 14.

Dlatego postanowiłem napisać własne narzędzie w Javie przy użyciu ANTLR4. Nazywa się Score i można go znaleźć tutaj: https://github.com/underrated/Score

W tej chwili jest w powijakach i może być pełen błędów, ale planuję go poprawić. Więc spróbuj, jeśli chcesz i zgłoś wszelkie błędy na stronie github projektu. Postaram się je naprawić tak szybko, jak to możliwe.

+0

Nie oczekuję, że w danej chwili będzie obsługiwać warunkowe preprocesory, ale zamierzam dodać do tego wsparcie. Poza tym narzędzie nie jest przeznaczone do semantycznego sprawdzania kodu. Po prostu identyfikuje implementacje metod, a następnie umieszcza prototypy metod w nagłówku i implementację metody w pliku źródłowym (plus kilka "separacji"). To od dewelopera zależy poprawność kodu (np. Za pomocą IDE). Jeśli oryginalny kod zawiera błędy składniowe/semantyczne, to także wygenerowany. Ale można je znaleźć, albo przez IDE, albo przez kompilator. –

+0

@IraBaxter Dlaczego potrzebowałbyś tak skomplikowanej obsługi rzeczy w kontekście problemu Michaela? Wszystko, czego potrzebuje, to zautomatyzować kopiowanie/wklejanie/modyfikowanie jakiegoś kodu. Specjalne leczenie #ifdefs jest rzeczywiście konieczne. Szablony nie muszą być dotykane, mogą pozostać w nagłówku. Wywołania makr będą postrzegane jako proste identyfikatory lub wywołania funkcji przez analizator składni i nie trzeba ich również dotykać. Jeśli chodzi o przestrzenie nazw, wszystkie instrukcje "using ..." mogą pozostać w nagłówku. A "przestrzeń nazw ... {...}" można skopiować zarówno do nagłówka, jak i do pliku źródłowego. Czy czegoś brakuje? –

Powiązane problemy