2009-07-14 68 views
16

Tôi muốn xem xét việc triển khai các hàm C/C++ khác nhau (như strcpy, stcmp, strstr). Điều này sẽ giúp tôi trong việc biết thực hành mã hóa tốt trong c/C++. Bạn có thể cho tôi biết nơi tôi có thể tìm thấy nó?mã nguồn của các hàm c/C++

Cảm ơn.

+0

Có thể lấy mã nguồn của thư viện chuẩn c không? –

+0

Mỗi trình biên dịch C sẽ sử dụng mã nguồn riêng của nó cho thư viện C chuẩn. Tương tự, mỗi trình biên dịch C++ sẽ sử dụng mã nguồn riêng của nó cho các thư viện C và C++ chuẩn (C++ bao gồm C để trình biên dịch cần cả hai thư viện). Tuy nhiên, nó cũng có thể là strcpy() được trình biên dịch trực tiếp thực hiện; nó có thể đơn giản phát ra mã đúng tại chỗ thay vì tạo một cuộc gọi hàm. – MSalters

+0

Vì vậy, để có được một thực hiện thư viện cụ thể, người ta phải tìm hiểu xem những người đã viết trình biên dịch quan tâm đã làm cho mã nguồn có sẵn? –

Trả lời

25

Bạn có thể kiểm tra bản sao glibc, mã này sẽ có mã nguồn cho tất cả các hàm C trong thư viện chuẩn C. Đó sẽ là một nơi khởi đầu tốt đẹp.

+3

Mặc dù đây là câu trả lời đầu tiên xuất hiện trong đầu, nhưng nó có thể không phải là nơi tốt nhất để tìm hiểu về "thực hành mã hóa tốt" có khả năng ứng dụng chung. Điều này là do các hàm glibc có lý do hợp pháp để được tối ưu hóa rất nhiều vi mô - thậm chí tối ưu hóa nền tảng cụ thể - đơn giản chỉ vì chúng là các hàm thư viện chuẩn. Đó không phải là một cách thực hành tốt cho lập trình chung. – caf

+0

@mipadi Tôi nhấp vào liên kết và đi vào các nguồn bên trong và kiểm tra http://ftp.gnu.org/gnu/glibc/. Không có math.h trong bất kỳ tệp .tar.gz nào. Tôi chỉ muốn nhìn vào sqrt(). Không viết hàm tối ưu. Chỉ cần để xem làm thế nào C hiện nó – Jsmith

6

Nhiều chức năng thư viện chuẩn C có danh sách mã nguồn & thảo luận trong The C Programming Language by Kernighan & Ritchie. Các cuộc thảo luận là một cách hữu ích để tìm hiểu thêm về các chi tiết cụ thể của ngôn ngữ C & cách các chức năng trong thư viện chuẩn hoạt động dưới mui xe.

+2

Nhiều chức năng trong K & R được thể hiện trong một hình thức đơn giản nhưng điều này có thể tốt hơn nếu chúng đang được sử dụng cho các ví dụ. –

+2

Cần đọc K & R cho bất kỳ người lập trình nào trong C. Rất ít người đã viết điều gì đó rất tốt trong một vài trang. – NoMoreZealots

+1

Đây là một gợi ý tốt hơn là xem các thư viện thực. Chúng được viết với mục tiêu dạy C, hơn là mục tiêu có thư viện C hiệu quả nhất. – caf

1

Here you go

Việc thực hiện sẽ khác nhau đôi chút từ hệ điều hành OS, nhưng việc thực hiện GNU/Linux có lẽ sẽ là cách đơn giản nhất để tìm hiểu đó.

4

Xem xét triển khai thư viện C chuẩn libc. Để xem cách một thư viện C thực sự, phổ biến được triển khai, hãy thử xem mã glibc. Bạn có thể truy cập vào mã sử dụng git:

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

Đối với C++, bạn có thể tìm thấy những glibC++ thư viện tiêu chuẩn trên một trong những gương:

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

Bạn cũng có thể kiểm tra uLibc, mà có lẽ sẽ đơn giản hơn so với thư viện GNU:

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

.210

Để cung cấp cho bạn một hương vị, đây là việc thực hiện strncpy từ 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; 
} 

Đây là strcmpstrstr

+5

Một ví dụ tuyệt vời về lý do tại sao việc triển khai thư viện C thực sự không phải là hướng dẫn tốt cho các thực hành lập trình tốt có thể áp dụng chung - có hai phiên bản được tái cấu trúc lại của cùng một vòng lặp cho các trình biên dịch C khác nhau. 'sẽ làm. – caf

2

"C Library Standarc" là một đặc điểm kỹ thuật. Bạn muốn các nguồn để thực hiện đặc tả. Trình biên dịch C của bạn có thể hoặc không cung cấp các nguồn như vậy - một trong đó là GCC.

0

Nếu bạn sử dụng Visual Studio Professional hoặc Team, bạn sẽ có thể tìm ra nguồn ở đây :

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

6

Hầu hết các trình biên dịch đều cung cấp mã nguồn cho thư viện - tuy nhiên mã nguồn đó thường phức tạp hơn và phức tạp hơn bạn mong đợi.

Một tài nguyên tốt cho việc này là P.J. Plauger's book, "The Standard C Library", có thể có giá khá rẻ nếu bạn sử dụng. Mã trình bày không phải luôn luôn thẳng về phía trước, nhưng Plauger giải thích nó khá tốt (và đưa ra những lý do tại sao nó không thể luôn luôn thẳng thắn và vẫn tuân theo tiêu chuẩn).

+1

Upvote cho liên kết sách! – zack

+0

Wow - có vẻ như các bản sao được sử dụng không còn rẻ nữa. Khoảng $ 45 là mức thấp nhất. Tôi tự hỏi tại sao? –

+0

Nhờ bạn, bạn của tôi :) – zack

14

Điều đáng nói là mã nguồn cho thư viện chuẩn C không nhất thiết làm nổi bật các phương pháp mã hóa tốt. Như thư viện chuẩn, nó có một trạng thái đặc biệt, ví dụ, nó có thể dựa vào rất nhiều hành vi không xác định hoặc không di động đơn giản chỉ vì họ biết trình biên dịch chính xác mà nó được sử dụng.

Và tất nhiên, điều này chỉ cho bạn biết về các phương pháp mã hóa C.

Điều đó không liên quan gì đến thực hành mã hóa C++, điều này rất khác nhau. Đừng đối xử với họ như một ngôn ngữ. Không có những thứ như C/C++. C là một ngôn ngữ với các thực hành mã hóa và các thành ngữ phổ biến của riêng nó, và C++ là một ngôn ngữ riêng biệt, độc lập cũng có các thực hành và thành ngữ riêng của nó.

Mã C hiếm khi hiếm khi mã C++ tốt. strcpy và các hàm thư viện C khác là chắc chắn mã C++ không tốt.

+0

Đây là suy nghĩ đầu tiên của tôi khi tôi nhìn thấy câu hỏi. Có thể lập luận rằng bộ xử lý C libaries tốt nhất LÀ bộ vi xử lý cụ thể. Một tổng quát C lib viết bằng chỉ C và số tiền tối thiểu của bộ vi xử lý/kiến ​​trúc chức năng cụ thể sẽ có hiệu suất crappy so với một libary nhắm mục tiêu cho hệ thống cụ thể. Điều này thậm chí còn nhiều hơn một mối quan tâm trên các nền tảng cầm tay, nơi lý do chung cho mã không hiệu quả không áp dụng. (tức là nó sẽ không được chạy trên bộ vi xử lý lõi tứ 3 + GHz với bộ nhớ vô hạn.) – NoMoreZealots

+0

Xin lỗi nếu điều đó nghe có vẻ thuyết phục, nhưng tôi cảm thấy khó chịu mỗi lần khởi động máy tính và mất nhiều thời gian hơn hệ thống tôi đã có 20 năm trước . Mọi người lấy lập luận "hiệu quả nhỏ" tới mức độ điên rồ trên các hệ thống hiện đại. Toàn bộ "netbook" và thị trường cầm tay làm cho tôi ham chơi khi tôi nghe mọi người rên rỉ về "nó không đủ mạnh" cho các ứng dụng đó. Bây giờ bạn thực sự phải NGH TH, đó không phải là một bitch! – NoMoreZealots

+0

Tôi hoàn toàn đồng ý, nhưng đến từ một hướng khác. Tôi viết các ứng dụng khoa học được thực hiện để chạy trên các cụm với hơn 1000 lõi. Ở quy mô này, những sự thiếu hiệu quả đó thực sự tăng lên. Trong 18 tháng khi chúng tôi nhận được một hệ thống mới với gấp đôi vấn đề, các vấn đề của chúng tôi có ít nhất gấp đôi kích thước. Phần cứng sẽ không bao giờ bắt kịp những gì chúng tôi muốn làm. – KeithB

0

Nói chung, tôi thấy libs BSD dễ đọc hơn nhiều so với GNU. Có ít "gcc-isms", cốt lõi rõ ràng hơn trong ý định, v.v. Ví dụ: BSD code for malloc có thể đọc được khá dễ dàng so với glibc

Các vấn đề liên quan