2010-09-04 15 views
23

Czy są jakieś narzędzia, które ułatwiają porządkowanie #include s, które należą do górnej części pliku .c lub .h?Czy istnieją narzędzia, które pomagają organizować #includes?

Po prostu zastanawiałem się, ponieważ przeorganizowuję mój kod, przenosząc różne małe definicje funkcji/deklaracje z jednego długiego pliku na różne mniejsze pliki. Teraz każdy z mniejszych plików potrzebuje podzestawu #include s, które znajdowały się u góry długiego pliku.

Jest po prostu denerwujące i podatne na błędy, aby dowiedzieć się wszystkie # zawiera ręcznie. Często kod kompiluje się, chociaż nie wszystkie są #include s tam. Przykład: Plik A szeroko wykorzystuje std::vector, ale nie obejmuje vector; ale obecnie zawiera trochę niejasny inny nagłówek, który zdarza się zawierać vector (może poprzez niektóre rekursywne obejmuje).

+0

Znalazłem omówienie tego problemu na stronie Eclipse CDT: http://wiki.eclipse.org/CDT/C_editor_enhancements/Include_management – Frank

Odpowiedz

1
+0

Dobry pomysł, ale prawdopodobnie nie dokładnie to, czego potrzebuję. Chciałbym narzędzie, które powie mi, co powinienem dołączyć, nawet jeśli nie dodałem jeszcze jednego dodatku (makedepend i znajomi podadzą w tym przypadku błąd). Eclipse robi to dla Javy (może również dla C++?). Ponadto, makedepend mówi mi o zależnościach dla każdej jednostki kompilacji ('.o' plik), ale nie to, co powinien zawierać konkretny plik nagłówkowy. – Frank

+3

Myślę, że problem, jaki stwarzasz, jest niemożliwy do usunięcia. Na przykład, mogę uruchomić program, który mówi mi, że 'EOF' jest niezdefiniowany w' foo.c'. Mogę również mechanicznie określić, że EOF jest zdefiniowany w 'libio.h',' stdio.h' i (np.) 'Foo.h'. Co mam uwzględnić? – msw

+4

przedstawiasz prawidłowy punkt. Jednak narzędzie może nadal tworzyć sugestie, na podstawie których nagłówki są obecne na ścieżce dołączania, a być może nawet są standardowe (lub popularne). –

2

VisualAssistX może pomóc skoki do definicji typu. Na przykład. jeśli używasz klasy MyClass w swoim źródle, możesz ją kliknąć, wybrać definicję goto, a VisualAssistX otworzy plik włączający, który zawiera definicję tej klasy (prawdopodobnie Visual Studio może to również zrobić, ale w tym momencie jestem już przyzwyczajony do VisualAssistX, że wnoszę każdą wspaniałą funkcję do VisualAssistX :-)). Możesz użyć tego do znalezienia pliku włączającego niezbędnego dla twojego kodu źródłowego.

PC-Lint może zrobić dokładnie odwrotnie. Jeśli masz plik włączający w swoim źródle, który nie jest używany, PC-Lint może Cię o tym ostrzec, abyś wiedział, że plik ten może zostać usunięty ze źródła (co będzie miało pozytywny wpływ na czas kompilacji) .

0

Używam generowanych wykresów doxygen/dot-graphviz, aby zobaczyć, jak pliki są połączone. Bardzo przydatny, ale nie automatyczny, musisz wizualnie sprawdzić wykresy, a następnie edytować kod, aby usunąć niepotrzebne linie "#include". Oczywiście niezbyt nadaje się do bardzo dużych projektów (powiedzmy> 100 plików), w których wykresy stają się bezużyteczne.

1

Ostatnio miałem do czynienia z tym problemem. W naszym projekcie używamy C++ i mają jeden Xh i jeden x.cpp plik dla każdej klasy X.

Moja strategia jest następująca:

(1) Jeśli Ach, gdzie klasa A jest zadeklarowanym, odnosi się do klasa B, następnie muszę dołączyć nagłówek Bh Jeśli deklaracja klasy A zawiera tylko typ * B, potrzebuję tylko przedniej deklaracji klasa B; w A.h. Być może powinienem włączyć B.h w A.cpp

(2) Korzystając z powyższej procedury, przenoszę jak najwięcej elementów z A.h do A.cpp. Następnie próbuję usunąć jeden z nich za jednym razem i sprawdzić, czy plik .cpp nadal się kompiluje. To powinno pozwolić zminimalizować zbiór dołączonych plików w pliku .cpp, ale nie jestem w 100% pewny, czy wynik jest minimalny. Myślę też, że można napisać narzędzie, które zrobi to automatycznie. Zacząłem pisać dla Visual Studio. Byłbym szczęśliwy wiedząc, że istnieją takie narzędzia.

Uwaga: może dodanie właściwego konstruktu modułu z dobrze zdefiniowanymi relacjami importu/eksportu może być pożądanym dodatkiem dla C++ 0x. To znacznie ułatwiłoby reorganizację importu i przyspieszyło kompilację.

1

Ponieważ kwestia ta został poproszony nowe narzędzie zostało stworzone: include-what-you-use, jest ona oparta na brzękiem, zapewnia mapowania fałszywe istnienie pewnych symboli (unique_ptr w memory, ale właściwie zdefiniowane w bits/unique_ptr.h w niektórych standardowych nagłówków i pozwala podać własne mapowania.

zapewnia ładne diagnostykę i automatyczne przepisanie.

1

Now each of the smaller files needs a subset of the #includes that were at the top of the long file.

zrobić to za pomocą VisualAssistX. Po pierwsze skompilować plik, aby zobaczyć co jest mis śpiewać. Następnie możesz użyć funkcji Dodaj dodaj VisualAssistX. Więc po prostu idę i klikam prawym przyciskiem myszy funkcje lub klasy, które wiem, że są potrzebne i włącz Dodaj Dodaj. Dokonaj ponownej kompilacji kilka razy, aby odfiltrować nowe brakujące elementy i to się skończy. Mam nadzieję, że napisałem to zrozumiale :)

Nie idealne, ale szybsze niż robienie tego ręcznie.