2009-08-02 5 views
6

Ich wurde ein professioneller Programmierer in der Ära des objektorientierten Codes und habe jahrelange Erfahrung in der Programmierung in C++. Ich arbeite oft an großen Projekten, die jahrelangen Legacy-Code in einer Mischung aus C++ und C haben. Ich fühle mich weniger wohl bei der Arbeit an reinen c-Teilen von Systemen. Aus der Programmierung in C++ verstehe ich die ganze c-Syntax, aber es gibt ein Loch in meinem Wissen darüber, wie man ein komplexes c-Programm ohne Objekte organisiert und was Best Practice für die Verwaltung von Speicher darstellt, das ich füllen möchte. Ich lernte C++ nach der Arbeit als Java-Programmierer, und denke ein bisschen mehr c würde mich zu einem besseren C++ - Programmierer, und ein bisschen weniger von Java in C++ - Programmierergibt es irgendwelche Tutorials, um einem fähigen C++ Programmierer zu helfen, c zu lernen?

+0

je Tutorial habe ich gefunden, scheint zu der Annahme, Sie sind ein c-Programmierer Umzug nach C++. Sicherlich kann ich nicht der einzige objektorientierte Programmierer sein, der c besser verstehen will. –

+0

Ich denke, wenn Sie ein paar mittelgroße C-Programme schreiben, die Ihnen beibringen, wie man sich aus Ärger heraushält. In Schwierigkeiten zu geraten (in jeder Sprache) ist eine wertvolle Art zu lernen. Wie etwas Heißes berühren. – Nosredna

+0

Es gibt mehrere Fragen in diesem Sinne bereits in StackOverflow (und einige C#, die zu c Fragen wechseln). Von meinem Muttersprachler meist funktional in C++ - Aussichtspunkt, sah ich jedoch einige Dinge Ratschläge, die gut aussahen. Sie könnten es wert sein, zu jagen. – dmckee

Antwort

1

In Bezug auf die Organisation, an der POSIX APIs suchen, vor allem pthreads geben Ihnen eine gute Vorstellung davon, wie C-Code zu organisieren. Die Grundregeln einer guten C-Projektorganisation sind:

  • Setzen Sie Ihre Strukturen nicht frei. Verwenden Sie nur opake Typen.
  • Verwenden Sie die Bibliotheks- und Datentypnamen als Präfixe für Funktionsnamen.
  • Stellen Sie "create" und "destroy" -Funktionen für die Zuordnung/Konstruktion und die Zerstörung/Freigabe zur Verfügung.
  • Übergeben Sie den opaken Typ als ersten Parameter für Funktionen, die für diesen Typ verwendet werden.
  • Implementieren Sie die C-APIs mit C oder C++ (es liegt an Ihnen). Natürlich verwenden Sie dort nicht-opake Typen.
0

Blick in das Erstellen von Programmen mit umfangreichen Verwendung von Zeigern sowie als Low-Level-Strukturen wäre meiner Meinung nach sowieso ein guter Anfang. Es hängt auch davon ab, wofür das Programm gebaut ist. Versuchen Sie, C-Code auf einem eingebetteten Rtos-Board oder einem Mikrocontroller-System zu schreiben?

+0

ich arbeite manchmal an Legacy-Systemen, die eine Menge von c haben, also das ist der ursprüngliche Grund. Ich vermute auch, dass es mich zu einem besseren C++ - Programmierer machen würde, um mit dem Entwerfen von Programmen vertraut zu sein, die um Daten in Strukturen und anderen c-Techniken herum gebaut sind, anstatt davon auszugehen, dass alles ein Objekt sein muss. –

+0

In diesem Fall würde ich sehr empfehlen, Ihr Zeigerwissen zu verbessern, da Java Ihnen nicht erlaubt, mit Zeigern umzugehen. Auch wenn Sie etwas über die Hardware-Optimierung erfahren möchten, wäre es großartig, wenn Sie einen eingebetteten Single-Board-Computer, Mikrocontroller oder ein Smartphone/PDA bekommen könnten, um zu lernen, C/C++ für Hardware zu schreiben. – stanigator

1

Ich war im Grunde das gleiche Boot wie du (wenn auch mit weniger Erfahrung, und ich begann mit Python und nicht Java), und was am besten für mich funktionierte, setzte sich hin und las Kernighan und Ritchie. Sie werden in der Lage sein, die erste Hälfte des Buches zu überfliegen, da Sie mit der Syntax vertraut sind, aber Sie werden auf jeden Fall mit einem besseren Verständnis des Low-Level-Speichermanagements vertraut sein.

Das Lesen der Teile der Linux-Kernel-Quelle, die mit Speicherverwaltung zu tun haben, hilft auch, ist aber nicht für schwache Nerven oder leicht zu langweilig.

1

Aufbauend auf another answer, ist eine Möglichkeit, nur zu schreiben, objektorientierter C. Dies ist die Art und Weise der meisten Bibliotheken, die ich mit behave interagieren (zum Beispiel des GNOME-Stack fast vollständig objektorientiertes C ist, vor allem auf der Grundlage der gobject Bibliothek, um es einfacher zu machen). Man kann es sich als C++ vorstellen, ohne einen Teil des syntaktischen Zuckers.

Sie am Ende mit einer API wie


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

, die

fast genau entspricht

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

In der ersten main() - Zeile des c-Beispiels fehlt ein Sternchen. – quinmars

+0

Ganz richtig. Danke, ich habe es behoben. – RAOF

Verwandte Themen