2009-08-02 11 views
6

Sono diventato un programmatore professionista nell'era del codice orientato agli oggetti e ho anni di esperienza nella programmazione in C++. Lavoro spesso su progetti di grandi dimensioni che hanno anni di codice legacy in un mix di C++ e c. Mi sento meno a mio agio a lavorare su parti di sistemi puri. Dalla programmazione in C++ capisco tutta la sintassi c, ma c'è un buco nella mia conoscenza su come organizzare un programma c complesso senza oggetti, e ciò che costituisce la migliore pratica per la gestione della memoria che vorrei riempire. Ho imparato C++ dopo aver lavorato come programmatore java, e penso un po 'di più c mi renderebbe un programmatore C++ migliore e un po' meno di un java tradotto in programmatore C++ci sono tutorial per aiutare un abile programmatore C++ a imparare c?

+0

il tutorial che ho trovato sembra presumere che tu sia un programmatore c che si sposta in C++. Sicuramente non posso essere l'unico programmatore orientato agli oggetti che vuole capire meglio c. –

+0

Penso che se scrivi un paio di programmi C di medie dimensioni che ti insegnano come stare fuori dai guai. In realtà mettersi nei guai (in qualsiasi lingua) è un modo prezioso per imparare. Mi piace toccare qualcosa di caldo. – Nosredna

+0

Ci sono diverse domande in questa vena su StackOverflow già (e alcuni C# si spostano in c domande). Dal mio altoparlante nativo per lo più funzionale nel punto di vista del C++, ho visto molte cose consigli che sembravano buone. Potrebbe valere la pena di andare a caccia. – dmckee

risposta

1

In termini di organizzazione, guardando il POSIX APIs, soprattutto pthreads vi darà una buona idea di come organizzare il codice C. Le regole di base dell'organizzazione del buon progetto C sono:

  • Non esporre le strutture. Utilizzare solo tipi opachi.
  • Utilizzare i nomi di libreria e tipo di dati come prefissi per i nomi di funzione.
  • Fornisce le funzioni "crea" e "distruggi" per allocazione/costruzione e distruzione/deallocazione.
  • Passare al tipo opaco come primo parametro delle funzioni che operano su quel tipo.
  • Implementa le API C utilizzando C o C++ (dipende solo da te). Ovviamente, usa tipi non opachi lì.
0

Guardare a programmi di costruzione con ampio uso di puntatori e le strutture di basso livello sarebbero comunque un buon inizio secondo me. Dipende anche da cosa è stato progettato il programma. Stai provando a scrivere il codice C su una scheda rtos embedded o un sistema di microcontrollori?

+0

a volte lavoro su sistemi legacy che hanno un sacco di c, quindi questa è la ragione iniziale. Sospetto anche solo che mi farebbe diventare un programmatore C++ migliore per familiarizzare con la progettazione di programmi che sono costruiti attorno a dati in strutture e altre tecniche, piuttosto che assumere che tutto debba essere un oggetto. –

+0

In tal caso, suggerirei di migliorare la conoscenza del puntatore, poiché Java non consente di gestire i puntatori. Inoltre, se si desidera conoscere l'ottimizzazione dell'hardware, sarebbe fantastico poter ottenere un computer embedded a bordo singolo, microcontrollori o smartphone/PDA per imparare come scrivere C/C++ ottimizzato per l'hardware. – stanigator

1

Ero praticamente sulla stessa barca (anche se con meno esperienza, e ho iniziato con Python piuttosto che con Java), e quello che ha funzionato meglio per me era sedermi e leggere Kernighan e Ritchie. Sarai in grado di sfogliare la prima metà del libro dal momento che ti senti a tuo agio con la sintassi, ma sicuramente riuscirai a comprendere meglio la gestione della memoria di basso livello.

Leggendo le parti del codice sorgente del kernel di Linux che hanno a che fare con la gestione della memoria aiuta anche, ma non è per i deboli di cuore o il annoia facilmente.

1

Ampliando another answer, un modo è quello di scrivere solo orientato agli oggetti C. Questo è il modo più librerie che interagiscono con comportano (ad esempio lo stack GNOME è quasi interamente orientata agli oggetti C, principalmente sulla base della gobject libreria per renderlo più facile). Puoi pensarlo come C++ senza un po 'di zucchero sintattico.

si finisce con un'API come


/* 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); 
} 

che corrisponde quasi esattamente al


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

Manca un asterisco nella prima riga main() dell'esempio c. – quinmars

+0

Abbastanza vero. Grazie, l'ho risolto – RAOF

Problemi correlati