2009-08-02 9 views
6

Stałem się profesjonalnym programistą w dobie kodu obiektowego i posiadam wieloletnie doświadczenie w programowaniu w C++. Często pracuję nad dużymi projektami, które mają lata starszego kodu w kombinacji C++ i c. Czuję się mniej komfortowo, pracując na czystych częściach systemu. Od programowania w C++ Rozumiem całą składnię c, ale wiem, jak zorganizować złożony program c bez obiektów i jaka jest najlepsza praktyka w zarządzaniu pamięcią, którą chciałbym wypełnić. Nauczyłem się C++ po pracy jako programista java i myślę, że nieco więcej c sprawiłoby, żebym był lepszym programistą C++, i nieco mniej z java przetłumaczonego na programistę C++Czy są jakieś tutoriale, aby pomóc biegły programista C++ uczyć się c?

+0

Znaleziony tutorial wydaje się zakładać, że jesteś programistą c, przenoszącym się do C++. Z pewnością nie mogę być jedynym programistą zorientowanym obiektowo, który chce lepiej zrozumieć c. –

+0

Myślę, że jeśli napiszesz kilka średniej wielkości programów C, które nauczą Cię, jak trzymać się z dala od kłopotów. Faktycznie wpadanie w kłopoty (w dowolnym języku) jest cennym sposobem nauki. Jak dotykanie czegoś gorącego. – Nosredna

+0

Jest kilka pytań w tym stylu na StackOverflow już (i niektóre C# przejście do c pytania). Z mojego ojczystego języka, głównie z punktu widzenia C++, zauważyłem kilka rzeczy, które wyglądały dobrze. Mogą być warte polowania. – dmckee

Odpowiedz

1

Pod względem organizacji, patrząc na POSIX APIs, zwłaszcza pthreads które daje dobry pomysł, jak zorganizować kod C. Podstawowe zasady dobrej organizacji projektu C to:

  • Nie wystawiaj swoich struktur. Używaj tylko typów nieprzezroczystych.
  • Użyj nazw bibliotek i typów danych jako przedrostków nazw funkcji.
  • Udostępnianie funkcji "twórz" i "niszcz" w celu przydzielania/konstrukcji i niszczenia/wycofywania.
  • Przepuścić typ nieprzezroczysty jako pierwszy parametr dla funkcji działających na tym typie.
  • Implementowanie C API przy użyciu C lub C++ (to zależy od Ciebie). Oczywiście używaj tam typów nieprzezroczystych.
0

Zajmuje się również budowaniem programów z szerokim wykorzystaniem wskaźników. jako że struktury niskopoziomowe i tak byłyby dobrym początkiem. Zależy to również od tego, do czego jest zbudowany program. Czy próbujesz napisać kod C na wbudowanej płycie rtos lub systemie mikrokontrolerów?

+0

Czasami pracuję nad starszymi systemami, które mają dużo c, więc to jest pierwszy powód. Podejrzewam też, że dzięki temu stałbym się lepszym programistą w C++, lepiej znającym programowanie oparte na danych w strukturach i innych technikach, niż zakładając, że wszystko musi być obiektem. –

+0

W takim przypadku bardzo polecałbym ulepszenie wiedzy na temat wskaźnika, ponieważ Java nie pozwala na radzenie sobie ze wskaźnikami. Także jeśli chcesz dowiedzieć się więcej o optymalizacji sprzętu, byłoby wspaniale, gdybyś mógł uzyskać wbudowany komputer jednopłytowy, mikrokontrolery lub smartfon/PDA, aby nauczyć się pisać z C/C++ zoptymalizowanego pod kątem sprzętu. – stanigator

1

Byłem w zasadzie tą samą łodzią jak ty (choć z mniejszym doświadczeniem i zacząłem od Pythona zamiast Javy), a najlepsze dla mnie było usiąść i czytać Kernighana i Ritchiego. Będziesz mógł przejrzeć pierwszą połowę książki, ponieważ nie masz nic przeciwko składni, ale na pewno odejdziesz z lepszym zrozumieniem zarządzania pamięcią niskiego poziomu.

Czytanie części jądra systemu Linux, które mają do czynienia z zarządzaniem pamięcią, również pomaga, ale nie jest dla osób o słabym sercu lub łatwo znudzonych.

1

Rozszerzając another answer, jednym ze sposobów jest po prostu napisz obiektowego C. W ten sposób większość bibliotek I zachowują interakcji z (na przykład stos GNOME jest prawie całkowicie obiektowego C, głównie w oparciu o gobject biblioteka, aby było łatwiej). Możesz myśleć o tym jako C++ bez cukru syntaktycznego.

skończyć z API jak


/* in project NewStuff; namespace is ns */ 
ns_foo_t *ns_foo_new(); 
void ns_foo_delete (ns_foo_t *); 

int ns_foo_make_waffles (ns_foo_t *this, int no_of_guests); 

int main() { 
    ns_foo_t *my_foo = ns_foo_new(); 
    ns_foo_make_waffles (my_foo, 1); 
    ns_foo_delete (my_foo); 
} 

co odpowiada niemal dokładnie do


class Foo { 
    public: 
    Foo() { /* whatever */ } 

    int make_waffles (int no_of_guests) {} 
}; 

int main() { 
    Foo *my_foo = new Foo(); 
    my_foo->make_waffles (1); 
    delete my_foo; 
} 
+0

Brakuje gwiazdki w pierwszej linii głównej() - wiersza przykładu c. – quinmars

+0

Całkiem prawda. Dzięki, naprawiłem to. – RAOF

Powiązane problemy