PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C/C++ faq



blackberry
15.09.2011, 18:02
http://img2.imagebanana.com/img/d79sbixk/faq.png

Link zum alten Thread von zao (http://free-hack.com/member.php?u=36391): http://free-hack.com/showthread.php?t=5705.
Wer Vorschläge für weitere FAQs hat kann sich gerne bei mir per PM melden.

Ist C/C++ für Anfänger geeignet?

Hier teilen sich die Meinungen stellenweise sehr. Viele bemängeln die große Verantwortung, die dem Programmierer zuteil wird, da man an vielen Stellen selber für den Speicher verantwortlich ist; andere hingegen argumentieren zugunsten des schmalen Sprachumfangs vor allem bei C. Ich persönlich favorisiere da eher letzteren Standpunkt. C (und auch C++, wenn man nicht jede Feinheit im OOP-Konzept berücksichtigen will) ist dank seines geringen Sprachumfangs sehr schnell zu erlernen (wenig Schlüsselwörter, klare Konzepte, übersichtliche Standardbibliothek). Man kann die Sprachen also in kurzer Zeit erlernen (bei mir waren es ca. zwei Wochen; damit ist aber keines Falls gemeint, dass man nach zwei Wochen jetzt sein eigenes Betriebssystem schreiben kann... gemeint ist einfach nur die Sprache "sprechen" zu können) und kleinere Programme schreiben.
Die Crux an der Sache ist aber dann auch wieder der oben genannte Vorteil der übersichtlichen Standardbibliothek. C und C++ als maschinennahe haben "von Haus aus" nur eine sehr kleine Anbindung an das Betriebssystem, auf dem programmiert wird, bzw. auf dem die fertigen Programme später laufen sollen. Während Sprachen wie z.B. Java integrierte Klassenbibliotheken besitzen, um beispielsweise Grafische Benutzerschnittstellen zu programmieren, muss man hier bei C/C++ stets auf externe Bibliotheken, oder APIs ausweichen und somit viele Entscheidungen treffen (WinAPI, GTK+, Qt, ...; und das nur für Grafische Oberflächen). Dabei muss man sich dann halt zusätzlich zu der Sprache noch in mehrere Bibliotheken oder APIs einarbeiten, um tatsächlich größere Programme schreiben zu können. Dies wird stellenweise auch dadurch verkompliziert, dass auch zwischen den Bibliotheken keine einheitliche Nutzungsgrundlage vorliegt. Zwei Bibliotheken, die den Programmierer mit ein und derselben Funktionalität ausstatten können aus Sicht des Programmierers völlig anders aussehen.
Wer jetzt absolut abgeschreckt ist könnte sich an der Stelle aber auch vor Augen führen, dass "die Auswahl haben" eben nicht nur Verantwortung, sondern auch Freiheit bedeutet. Wer hier den Überblick hat, der findet oft auch sehr passende Bibliotheken. Ein anderer Vorteil des minimalistischen Aufbaus von C und C++ ist eben, dass man nicht von Anfang an alles auf dem Silbertablett serviert bekommt. Man kann natürlich seufzen und bedauern, dass man das und das wieder nicht mit einer einzigen Zeile Quelltext bewerkstelligen kann, jedoch wird man frei nach dem Motto "was dich nicht umbringt, macht dich stärker" auch gleich darauf vorbereitet sich die benötigte Funktionalität selber zu programmieren. Meiner Erfahrung nach haben die Programmierer, die mit anderen Sprachen groß werden häufiger Probleme etwas zu programmieren, wenn die eigentliche Funktionalität nicht bereits im Groben von ihrer benutzten Bibliothek bereitgestellt wird. Man könnte also sagen, wenn man laufen lernt hat man es schwer, aber dafür beim Treppen steigen gar nicht mehr. Die, die nicht laufen Lernen und auf einem Rollstuhl fahren, werden oft schneller sein, kommen aber an Treppen nicht vorbei.
Bei C/C++ ist der Dualismus von Macht und Verantwortung sehr stark ausgeprägt. Wer also bereit ist einen steinigen Berg zu besteigen, der läuft zwar Gefahr zu scheitern, aber wird dafür mit einem weiten Blick entlohnt.
Der "Abstieg" auf andere Sprachen ist dann konform zu der Metapher mit dem Berg ein leichter und schneller.


C oder C++?

C Code kann fast immer direkt als C++ compiliert werden (ich sage fast, weil es eben doch ein paar Ausnahmen gibt, beispielsweise structs, deren Member man in C noch via struct A a = {.member = Wert} initialisieren konnte; das sind jedoch eher Ausnahmen). Man könnte C++ also etwas salopp als "Erweiterung" von C bezeichnen (Früher hieß C++ "C with Classes" um die hinzugefügte Objektorientierung zu betonen; der heutige Name ist daran orientiert, dass man in C den Wert einer Variablen durch das schreiben von "variable++" erhöhen kann; C++ ist also gewissermaßen eine Weiterentwicklung von C). Wie der ursprüngliche Name "C with Classes" nahelegt ist C++ nicht nur "rückwärts" kompatibel, sondern auch wirklich an C orientiert. Das heißt, dass man also nicht einfach C Code als C++ Code compilieren kann, sondern dass man im Prinzip beim Programmieren in C++ auch gleich C Code schreibt (im weiteren Sinne zumindest).
Die Frage ob man C, oder doch lieber C++ lernen sollte erübrigt sich also insofern, als dass man sagen kann, dass man beim Lernen von C++ sowieso C mit lernt. Um als C++ Programmierer in C zu programmieren muss man also im Wesentlichen nur wissen, was man nicht verwenden darf (Klassen, Templates, Overloading und Try-Catch zum Beispiel) und dass man zum Reservieren von Speicher die Funktion "malloc" statt dem Operator "new" benutzt.
Meine Empfehlung wäre also einfach C++ zu lernen, weil man C dann gewissermaßen mit lernt und dann zusätzlich noch weitere Konzepte wie Objektorientierte Programmierung, Templates, usw. in den Schoß gelegt bekommt. Dabei sei allerdings angemerkt, dass man mit C und C++ genau dasselbe machen kann, es aber manchmal einfacher ist C++ zu können.


Compiler, Linker, IDE. Was ist der Unterschied?

Da viele den Unterschied nicht kennen und es dann oft zu Verwechslungen kommt, hier mal die Antwort um das klar zu stellen:
Eine IDE (engl. Integrated Development Enviroment) ist ein Programm, das euch das Schreiben von Programmen und Testen erleichtern soll. Häufige Bestandteile hiervon sind ein Editor (oft mit Syntax Highlighting -- also einer Funktion, die den Quelltext farblich differenziert nach Schlüsselwörtern, Variablen, Befehlszeichen, usw. hervorhebt) und diverse Funktionen zum Arbeiten an Projekten (also Programmen, die durchaus aus mehr als nur einer Quelldatei bestehen). Zusätzlich fungiert die IDE noch als Frontend für verschiedene Programme. Darunter den Compiler und Linker (dazu gleich mehr), Debugger (zum Auffinden von Fehlern bei laufendem Programm), evtl. einem Versionskontrollsystem zum verteilten Arbeiten in Teams (z.B. Subversion), uvm.
Ein Compiler ist ein Programm, das euren Quelltext in eine andere Sprache übersetzt (daher der Name: Übersetzer). Im Fall von Java wäre das (im Fall von javac; gcj u.ä. seien hier mal außen vor) der Bytecode, der von der Java Virtual Machine (einem Programm zum Ausführen von Java-Programmen) interpretiert und ausgeführt wird. Im Fall von C bzw. C++ wäre das tatsächlicher Maschinencode, der von der entsprechenden CPU der Zielarchitektur ausgeführt werden kann. Dabei verpackt der Compiler noch weitere Informationen, wie z.B. die Position von Funktionen und speichert das ganze zusammen mit dem Maschinencode in einer Übergangsdatei, einer sogenannten "Objektdatei" (Dateiendung oft ".o", oder ".obj")
Ein Linker ist ein Programm, das aus eine oder mehrere Objektdateien zu einem ausführbaren Programm zusammensetzt (in heutigen Betriebssystemen ist eine ausführbare Datei, wie z.B. eine ".exe", wie man sie von Windows kennt, kein reiner Maschinencode, der von der CPU ausgeführt wird, sondern Maschinencode verpackt zusammen mit vielen weiteren Informationen, z.B. "wo soll das Programm im Speicher landen", oder "welche Bibliotheken müssen auch geladen werden, damit das Programm ausgeführt werden kann", oder für Benutzer offensichtlicher: "welches Icon wird für dieses Programm angezeigt").
Zum Übergang "Quelltext -> ausführbares Programm" gehören also tatsächlich zwei Programme. Oft wird einem jedoch eher der Compiler begegnen, da dieser standardmäßig auch gleich den Linker von selber aufruft. Es ist dadurch sicher bereits offensichtlich, dass Compiler und Linker eng miteinander verwandt sind und gegenseitig voneinander Notiz nehmen müssen (insbesondere muss der Compiler wissen, wie der Linker aufzurufen ist). Es folgt also unmittelbar, dass jemand der einen Compiler herstellt in der Regel auch gleich einen zugehörigen Linker herstellt. Daher ist, wenn man von einem Compiler redet oft auch der Linker gleich mit gemeint, obwohl man diesen nicht extra erwähnt (eine Konvention, die ich im Folgenden auch benutzen werde).
Da wie oben bereits erwähnt die IDE als Fontend zu Compiler und Linker fungiert ist auch klar, dass diese um die Bedienung besagter Programme bescheid wissen muss. Darum ist es üblich Compiler und Linker (und natürlich alle zusätzlichen Dateien, die zum ordnungsgemäßen erstellen von Programmen benötigt werden, wie Include-Dateien, Libs für die entsprechenden Bibliotheken, usw.)


Welche IDE, welchen Compiler (+Linker)?

Auch eine Frage, die hier schon oft heiß diskutiert wurde und ich mich darum hier auch nicht festlegen möchte. Setzt euch selber ins Bild und trefft eine Entscheidung. Anfängern rate ich jedoch gerne mal zu übersichtlichen kleinen und übersichtlichen IDEs, da man dann nicht zusätzlich die Bedienung der IDE erlernen muss.
Dazu würden Dev-C++ (http://www.bloodshed.net/devcpp.html) (veraltet) und Code::Blocks (http://www.codeblocks.org/) zählen. Beide benutzten MinGW (http://www.mingw.org/) (Windows-Port der GNU Compiler Collection [GCC] (http://gcc.gnu.org/), sowie der benötigten Hilfsprogramme) als Compiler und Linker.
Auch nennenswert sind natürlich Visual Studio (http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express) von Microsoft (in Form von "Express Editions" auch kostenlos verfügbar) und Eclipse (http://www.eclipse.org/), wobei beide eher einen fortgeschritteneren Benutzer im Auge haben. Visual Studio benutzt den Compiler und Linker Microsoft-eigene Fabrikate und Eclipse kommt ganz ohne solche (eine extra Installation von beispielsweise MinGW ist erforderlich; allerdings unterstützt Eclipse auch andere Compiler und Linker).
Die Linux-Benutzer und Benutzer UNIXoider Systeme unter uns haben mit der GNU Compiler Collection (GCC) bereits einen entsprechenden Compiler und Linker vorinstalliert. Die Wahl Wahl der IDEs ist hier im Prinzip riesig. Auch Code::Blocks und Eclipse sind hier wieder vertreten, gesellen sich damit aber auch zu Kollegen, wie KDevelop (http://kdevelop.org/) für KDE. Ansonsten kann man natürlich auch nano (http://www.nano-editor.org/), Vim (http://www.vim.org/), Emacs (http://www.gnu.org/software/emacs/), gedit (http://projects.gnome.org/gedit/), usw. benutzen.
Mac-Benutzer können sich über den App-Store Apples Xcode (http://developer.apple.com/technologies/tools/) runterladen, welches zusätzlich zu der IDE eine von Apple modifizierte Version von GCC mit installiert.
Für eine etwas komplettere Liste von IDEs und Compilern verweise ich hier mal auf Wikipedia:
IDE-Liste: http://en.wikipedia.org/wiki/Comparison_of_integrated_development_environments# C.2FC.2B.2B
Compiler-Liste: http://en.wikipedia.org/wiki/List_of_compilers#C.2B.2B_compilers


Welche Bücher könntet ihr mir empfehlen?

Hier verweise ich auf den entsprechenden Sammelthread. Dort solltet ihr eine entsprechend große Auswahl vorfinden:
http://free-hack.com/showthread.php?t=31733


Gibt es Tutorials mit denen ich anfangen könnte?

Der Sammelthread von oben enthält auch eine (kleine) Liste von Tutorials. Wer ernsthaft C/C++ lernen will, dem kann ich jedoch wirklich nur wärmstens ein Buch empfehlen, da Tutorials oft unvollständig (je nach Lust und Laune des Verfassers) und fehlerhaft (je nach Wissensstand und Fähigkeit des Verfassers) sind.
Bei Büchern verdient der Autor Geld und entsprechend höher ist auch die Qualität als bei jemandem, der eine Tutorialreihe zum reinen Zeitvertreib schreibt.
Wer sich dennoch nicht für Bücher begeistern kann, der kann natürlich nach Tutorials suchen -- aber bedenkt: ich habe euch gewarnt!
In Ermangelung großer Mengen an guten C/C++ Tutorials, die von Mitgliedern von Free-Hack hier gepostet wurde kann ich nur diesen Link anbieten: (sind doch recht anständig, sind aber mangels Menge nicht zum Erlernen von C/C++ geeignet!)
http://free-hack.com/showthread.php?t=44432 von Kolabi (http://free-hack.com/member.php?u=36842)


Wie sollte ich meinen Code formatieren?

Wenn ihr das fragt seid ihr herzlich eingeladen euch folgende Threads durchzulesen und euren eigenen Coding-Stil entsprechend zu gestalten:
http://free-hack.com/showthread.php?t=4759 von -[RiDER]- (http://free-hack.com/member.php?u=35827)
http://free-hack.com/showthread.php?t=53301 von aL1ien (http://free-hack.com/member.php?u=36739)
Gut und konsequent formatierter Code fördert enorm das Verständnis. Das hilft nicht nur euch beim Programmieren, oder anschauen eurer älteren Codes, sondern auch uns hier, falls ihr Hilfe braucht und Code postet. Es lohnt sich also!


Mein Programm schließt sich dauernd. Woran liegt das?

Vor allem eine Frage, die unter den Windows-Benutzern verbreitet ist, die gerade mit C/C++ anfangen und ihre Programme testen wollen:
http://free-hack.com/showthread.php?t=39343
Linux-Benutzer, oder allgemeiner diejenigen, die ihre Programme sowieso von der Konsole aus ausführen haben damit verständlicherweise keine Schwierigkeiten.