簡體   English   中英

c / c ++函數的源代碼

[英]source code of c/c++ functions

我想看一下不同C / C ++函數的實現(比如strcpy,stcmp,strstr)。 這將有助於我了解c / c ++中的良好編碼實踐。 你能告訴我在哪里可以找到它嗎?

謝謝。

你可以查看一份glibc ,它將包含C標准庫中所有C函數的源代碼。 這應該是一個很好的起點。

值得指出的是,C標准庫的源代碼並不一定突出了良好的編碼實踐。 作為標准庫,它具有特殊的狀態,例如,它可以依賴於許多未指定或不可移植的行為,因為它們知道使用它的確切編譯器。

當然,這只會告訴您C編碼實踐。

這與C ++編碼實踐無關,這與C ++編碼實踐截然不同。 不要將它們視為一種語言。 沒有C / C ++這樣的東西。 C是一種具有自己的編碼實踐和常用習語的語言,C ++是一種獨立的,獨立的語言,也有自己的實踐和習語。

好的C代碼很少是好的C ++代碼。 strcpy和其他C庫函數肯定不是很好的C ++代碼。

大多數編譯器都為庫提供源代碼 - 但是源代碼通常比您預期的更復雜和復雜。

PJ Plauger的書“標准C庫”是一個很好的資源,如果你選擇使用它,它可以非常便宜。 提供的代碼並不總是直截了當,但Plauger很好地解釋了它(並給出了為什么它不能總是直截了當仍然遵循標准的原因)。

許多C標准庫函數都有Kernighan和Ritchie的C編程語言源代碼清單和討論。 討論是一種有用的方式,可以更多地了解C語言的細節以及標准庫中的函數如何在底層工作。

查看libc標准C庫的實現。 要了解如何實現真正的流行C庫,請嘗試查看glibc代碼。 您可以使用git訪問代碼:

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

至於C ++,你可以在其中一個鏡像上找到glibc ++標准庫:

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

您還可以查看uLibc,它可能比GNU庫更簡單:

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

為了給你一個味道,這是uLibc的strncpy實現:

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;
}

這是strcmpstrstr

“Standarc C Library”是一個規范。 您需要實現規范的源代碼。 你的C編譯器可能會或不會提供這樣的源 - 一個是GCC

您還可以查看OpenBSD源代碼樹 具體來說,您需要libc的字符串子目錄

大約10年前,我讀過普勞格的標准C圖書館 徹底推薦它。

干得好

從操作系統到操作系統,實現方式會有所不同,但GNU / Linux實現可能是最容易找到的實現方式。

這是NetBSD中的一般strXXX C函數: http ://cvsweb.netbsd.org/bsdweb.cgi/src/common/lib/libc/string/

這是i386處理器的NetBSD strXXX實現http://cvsweb.netbsd.org/bsdweb.cgi/src/common/lib/libc/arch/i386/string/

如果您使用Visual Studio Professional或Team,您應該能夠在此處找到源:

C:\\ Program Files \\ Microsoft Visual Studio 9.0 \\ VC \\ crt \\ src

出於您的目的, 本書可能會有所幫助: 使用C掌握算法

一般來說,我發現BSD libc比GNU libc更容易閱讀。 有更少的“gcc-isms”,核心在意圖上更清晰等等...例如,與glibc相比,mallocBSD代碼相當可讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM