2011-02-01 18 views
41

Powiel możliwe:
source code of c/c++ functionskod dla funkcji printf w C

Zastanawiałem się, gdzie mogę znaleźć kod C, który jest używany tak, że kiedy piszę printf ("Hello World! "); w moim programie C, aby wiedzieć, że musi wydrukować ten ciąg do STDOUT. Spojrzałem w <stdio.h>, ale tam mogłem znaleźć jego prototyp int printf (format const char *, ...), ale nie jak to wygląda wewnętrznie.

+0

Z której implementacji? Każda platforma ma swoje własne ... – thkala

+1

Nie sądzę, że jest dostępne źródło. +1 w każdym razie, zawsze się nad tym zastanawiałem. – BlackBear

+0

Docelowo printf musi wykonać wywołanie OS, więc dokładna implementacja zależy od platformy. Podążanie za szlakiem od printf do rzeczywistych wywołań systemu operacyjnego może być dość nieporządne. Źródło biblioteki C-Runtime Library (CRT) jest zwykle dostępne z kompilatorem (prawda dla GCC i MSVC). – Tergiver

Odpowiedz

0

W zależności od platformy i wdrożenia; jedna dobra realizacja jest GNU C, który można pobrać z here

+2

Nie nazwałbym tego dobrym wdrożeniem. Spróbuj napisać program, który wyczerpuje pamięć za pomocą pętli nazywającej 'malloc (10)', a następnie używając 'printf' ... :-) Ma również problemy z zgodnością w locale UTF-8. –

57

Oto wersja GNU printf ... widać, że przekazując stdout do 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.

Oto a link do vfprintf ... dzieje się tutaj cała "magia" formatowania.

Jedyną rzeczą, która naprawdę różni się od tych funkcji, jest to, że używają varargs do uzyskania argumentów na liście argumentów o zmiennej długości. Poza tym są po prostu tradycyjne C. (Jest to przeciwieństwo do odpowiednika Pascala printf, które jest implementowane z określoną obsługą kompilatora ... przynajmniej było z powrotem w dniu.)

+0

Gdzie ten plik znajduje się pod moim systemem Linux. Używam RHEL. Dzięki! – zack

+0

@Jerry Jego kod obiektowy znajduje się w bibliotece libc. Pobierz kod źródłowy glibc dla źródła. – a3f