2011-02-01 17 views
41

thể trùng lặp:
source code of c/c++ functionsMã cho chức năng printf trong C

tôi đã tự hỏi nơi tôi có thể tìm mã C được sử dụng để khi tôi viết printf ("Hello World! "); trong chương trình C của tôi để biết rằng nó phải in chuỗi đó tới STDOUT. Tôi nhìn vào <stdio.h>, nhưng ở đó tôi chỉ có thể tìm thấy nguyên mẫu int printf của nó (định dạng const char *, ...), nhưng không phải như thế nào nó trông giống như nội bộ.

+0

Thực hiện từ đâu? Mỗi nền tảng đều có ... – thkala

+1

Tôi không nghĩ rằng có sẵn nguồn. 1 anyway, tôi luôn luôn tự hỏi điều này. – BlackBear

+0

Cuối cùng printf phải thực hiện cuộc gọi hệ điều hành để việc triển khai chính xác là nền tảng cụ thể. Theo dấu vết từ printf xuống đến cuộc gọi hệ điều hành thực tế (s) có thể khá lộn xộn. Nguồn cho Thư viện C-Runtime (CRT) thường có sẵn với trình biên dịch (đúng cho GCC và MSVC). – Tergiver

Trả lời

0

Tùy thuộc vào nền tảng của bạn và triển khai; một thực hiện tốt là GNU C mà bạn có thể tải về từ here

+2

Tôi sẽ khó gọi nó là một sự thực hiện tốt. Hãy thử viết một chương trình loại bỏ bộ nhớ bằng một vòng lặp gọi là 'malloc (10) 'sau đó sử dụng' printf' ... :-) Nó cũng có các vấn đề tương thích trong miền địa phương UTF-8. –

57

Dưới đây là phiên bản GNU của printf ... bạn có thể nhìn thấy nó đi qua trong stdout-vfprintf:

__printf (const char *format, ...) 
{ 
    va_list arg; 
    int done; 

    va_start (arg, format); 
    done = vfprintf (stdout, format, arg); 
    va_end (arg); 

    return done; 
} 

See here.

Dưới đây là a link đến vfprintf ... tất cả định dạng 'ma thuật' xảy ra ở đây.

Điều duy nhất thực sự 'khác biệt' về các hàm này là chúng sử dụng các vararg để nhận các đối số trong một danh sách đối số độ dài biến đổi. Khác hơn thế, chúng chỉ là C. truyền thống (Điều này trái ngược với tương đương printf của Pascal, được thực hiện với sự hỗ trợ cụ thể trong trình biên dịch ... ít nhất nó đã trở lại trong ngày.)

+0

Tệp này nằm trong hệ thống Linux của tôi ở đâu. Tôi đang sử dụng RHEL. Cảm ơn! – zack

+0

@Jerry Mã đối tượng của nó nằm trong libc của bạn. Tải xuống mã nguồn glibc cho nguồn. – a3f