2009-07-14 22 views
16

Ich wollte mir die Implementierung verschiedener C/C++ Funktionen (wie strcpy, stcmp, strstr) ansehen. Dies wird mir helfen, gute Programmierpraktiken in c/C++ zu kennen. Können Sie mich wissen lassen, wo ich es finden kann?Quelltext von c/C++ Funktionen

Danke.

+0

Ist es möglich, den Quellcode der Standard-C-Bibliothek zu bekommen? –

+0

Jeder C-Compiler verwendet seinen eigenen Quellcode für die Standard-C-Bibliothek. In ähnlicher Weise verwendet jeder C++ - Compiler seinen eigenen Quellcode für die Standard-C- und C++ - Bibliotheken (C++ enthält C, so dass ein Compiler beide Bibliotheken benötigt). Es ist jedoch auch möglich, dass strcpy() direkt vom Compiler implementiert wird; Es könnte einfach den richtigen Code anstelle eines Funktionsaufrufs ausgeben. – MSalters

+0

Um also eine bestimmte Bibliotheksimplementierung zu erhalten, muss man herausfinden, ob die Leute, die den Compiler von Interesse geschrieben haben, den Quellcode verfügbar gemacht haben? –

Antwort

25

Sie können eine Kopie von glibc auschecken, die den Quellcode für alle C-Funktionen in der C-Standardbibliothek haben wird. Das sollte ein guter Startplatz sein.

+3

Obwohl dies die erste Antwort ist, die einem einfällt, ist es vielleicht nicht der beste Ort, um etwas über "gute Programmierpraktiken" zu lernen, die allgemein anwendbar sind. Dies liegt daran, dass die glibc-Funktionen einen berechtigten Grund haben, stark mikrooptimiert zu sein - sogar plattformspezifische Optimierungen -, einfach weil sie Standardfunktionen der Bibliothek sind. Das ist normalerweise keine gute Übung für die allgemeine Programmierung. – caf

+0

@mipadi Ich klickte auf den Link und ging in Quellen und überprüfte http://ftp.gnu.org/gnu/glibc/. In keiner .tar.gz-Datei ist math.h enthalten. Ich möchte nur auf sqrt() schauen. Nicht um eine optimierte Funktion zu schreiben. Nur um zu sehen, wie C es tut – Jsmith

6

Viele C-Standardbibliothek Funktionen haben Quellcodeauflistung & Diskussionen in The C Programming Language by Kernighan & Ritchie. Die Diskussionen sind eine hilfreiche Möglichkeit, mehr über die Besonderheiten der C-Sprache zu erfahren, wie Funktionen in der Standardbibliothek unter der Haube funktionieren.

+2

Viele Funktionen in K & R sind in einer vereinfachten Form gezeigt, aber das kann besser sein, wenn sie für Beispiele verwendet werden. –

+2

K & R sollte für jeden, der in C programmiert, gelesen werden. Nur wenige haben etwas so Gutes auf so wenigen Seiten geschrieben. – NoMoreZealots

+1

Dies ist ein besserer Vorschlag als echte Bibliotheken zu betrachten. Diese wurden mit dem Ziel geschrieben, C zu lehren, und nicht das Ziel, die effizienteste C-Bibliothek zu haben. – caf

1

Here you go

Die Implementierung wird etwas von OS OS variieren, aber die GNU/Linux-Implementierung ist wahrscheinlich das einfachste sein werde da draußen zu finden.

4

Schauen Sie sich eine Implementierung der libc Standard-C-Bibliothek an. Um zu sehen, wie eine echte, beliebte C-Bibliothek implementiert wird, schauen Sie sich den glibc-Code an. Sie können den Code mit Git zugreifen:

git clone git: //sourceware.org/git/glibc.git

Wie für C++, können Sie die glibC++ Standard-Bibliothek auf einem dieser Spiegel finden:

http://gcc.gnu.org/mirrors.html

Sie können auch uLibc Check-out, die wahrscheinlich einfacher sein als die GNU-Bibliothek:

http://git.uclibc.org/uClibc/tree/

Ihnen einen Eindruck zu geben, hier ist die strncpy Implementierung von uLibc:

Wchar *Wstrcpy(Wchar * __restrict s1, const Wchar * __restrict s2) 
{ 
    register Wchar *s = s1; 

#ifdef __BCC__ 
    do { 
     *s = *s2++; 
    } while (*s++ != 0); 
#else 
    while ((*s++ = *s2++) != 0); 
#endif 

    return s1; 
} 

Hier ist strcmp und strstr

+5

Ein gutes Beispiel dafür, warum echte C-Bibliotheksimplementierungen kein guter Leitfaden für allgemein anwendbare gute Programmierpraktiken sind - die beiden leicht refaktorierten Versionen der gleichen Schleife für verschiedene C-Compiler wären in den meisten Programmen fast nie gerechtfertigt 'Wird schon. – caf

2

"Die Standarc C Library" ist eine Spezifikation. Sie möchten die Quellen für eine Implementierung der Spezifikation. Ihr C-Compiler kann solche Quellen bereitstellen oder nicht - eine, die dies tut, ist GCC.

0

Wenn Sie Visual Studio Professional oder Teams verwenden, sollten Sie in der Lage sein, die Quelle hier finden :

C: \ Programme \ Microsoft Visual Studio 9.

6

Die meisten Compiler bieten Quellcode für die Bibliothek - allerdings ist dieser Quellcode normalerweise komplexer und komplexer als erwartet.

Eine gute Ressource dafür ist P.J. Plauger's book, "The Standard C Library", die ziemlich billig zu haben ist, wenn Sie für eine gebrauchte gehen. Der vorgestellte Code ist nicht immer geradlinig, aber Plauger erklärt es recht gut (und gibt die Gründe an, warum es nicht immer geradlinig sein kann und trotzdem dem Standard folgt).

+1

Upvote für den Buch-Link! – zack

+0

Wow - es sieht so aus, als ob gebrauchte Kopien nicht mehr billig sind. Etwa $ 45 ist das untere Ende. Ich wundere mich warum? –

+0

Dank dir, mein Freund :) – zack

14

Es ist erwähnenswert, dass der Quellcode für die C-Standardbibliothek nicht unbedingt gute Codierpraktiken hervorhebt. Als Standard-Bibliothek hat sie einen besonderen Status, wo sie sich zum Beispiel auf eine Menge nicht spezifiziertes oder nicht-portables Verhalten verlassen kann, einfach weil sie den genauen Compiler kennen, mit dem sie benutzt wird.

Und natürlich, das sagt Ihnen nur über C-Codierung Praktiken.

Das hat nichts mit C++ - Programmierpraktiken zu tun, die sehr unterschiedlich sind. Behandele sie nicht als eine Sprache. So etwas wie C/C++ gibt es nicht. C ist eine Sprache mit eigenen Programmierpraktiken und gebräuchlichen Idiomen, und C++ ist eine separate, unabhängige Sprache, die auch ihre eigenen Praktiken und Idiome hat.

Guter C-Code ist selten guter C++ - Code. strcpy und andere C-Bibliothek Funktionen sind sicherlich nicht gut C++ Code.

+0

Das war mein erster Gedanke, als ich die Frage sah. Es ist vertretbar, dass die besten C-Bibliotheken prozessorspezifisch sind. Eine allgemeine C-Bibliothek, die nur in C geschrieben ist und minimale Mengen an prozessor-/architekturspezifischer Funktionalität aufweist, wird im Vergleich zu einer gezielten Bibliothek für das jeweilige System eine schlechte Leistung haben. Dies betrifft vor allem Handheld-Plattformen, bei denen die allgemeinen Entschuldigungen für ineffizienten Code nicht gelten. (Es wird nicht auf einem 3 + GHz Octo-Core-Prozessor mit unbegrenztem Speicher ausgeführt.) – NoMoreZealots

+0

Tut mir leid, wenn das predigen klang, aber ich ärgere mich jedes Mal, wenn ich meinen PC boote und es dauert länger als ein System, das ich vor 20 Jahren hatte . Die Leute nehmen das Argument der "kleinen Effizienzen" auf eine Ebene des Wahnsinns moderner Systeme. Der ganze "Netbook" - und Handheld-Markt macht mich schwindlig, wenn ich höre, wie Leute darüber jammern, "es ist nicht stark genug" für ihre Anwendungen. Jetzt musst du eigentlich DENKEN, ist das nicht eine Schlampe! – NoMoreZealots

+0

stimme ich völlig zu, aber aus der anderen Richtung kommend. Ich schreibe wissenschaftliche Anwendungen, die auf Clustern mit mehr als 1000 Kernen laufen. In dieser Größenordnung addieren sich diese kleinen Ineffizienzen. In 18 Monaten, wenn wir ein neues System mit doppeltem Problem bekommen, haben sich unsere Probleme mindestens verdoppelt. Die Hardware wird niemals dem entsprechen, was wir tun wollen. – KeithB

0

Im Allgemeinen finde ich die BSD libc viel einfacher zu lesen als die GNU. Es gibt weniger "gcc-isms", der Kern ist viel klarer in der Absicht, etc .. Zum Beispiel ist die BSD code for malloc ist gut lesbar im Vergleich zu glibc