2013-04-07 3 views
1
int printf (const char *__format, ...) 
{ 
    register int __retval; 
    __builtin_va_list __local_argv; __builtin_va_start(__local_argv, __format); 
    __retval = __mingw_vprintf(__format, __local_argv); 
    __builtin_va_end(__local_argv); 
    return __retval; 
} 

위의 행은 printf 기능에 해당하는 stdio 라이브러리의 일부입니다. printf이 호출되면 실행됩니다. 이 라인은 무엇을 의미합니까? 위의 각 행이 실행될 때 어떤 일이 발생합니까?Printf는 C 언어의 일부가 아닙니다. PRINTF의 코드를 따르는 것이 stdio.h에서 실행될 때 실제로 일어나는 일은 무엇입니까?

+1

대부분은 가변 인자 기능에 대한 정보를 통해 답변을 얻을 수 있습니다. – chris

+0

'printf()'를 구현하는 방법에 관심이 있다면, 최근에 작성한 구현은 https://github.com/duskwuff/lm-project0/blob/master/stdio.c에서 볼 수 있습니다. – duskwuff

+1

에 오신 것을 환영합니다. 당신은 실수로'printf' *는 C 언어의 일부입니다. 표준 문서에서 C의 필수 부분으로 지정됩니다. 플랫폼이 언어의 라이브러리 부분을 구현하는 방법은 완전히 다릅니다. 일반적으로 이러한 구현은 일종의 까다 롭고 읽기가 쉽지 않습니다. C에서 초보자 인 경우 C 프로그램을 더 간단한 코드로 읽고 작성해야합니다. –

답변

3

이것은 실제 작업을 수행하는 다른 기능 __mingw_vprintf의 래퍼입니다. 여기서 유일한 코드는 가변 인수 목록을 다시 패키지하는 것입니다. 따라서 Mingw이 실제로 어떻게 작동하는지 보려면 함수와 그 함수가 호출하는 다른 함수를 살펴 봐야합니다. 정말로 관심이 있다면, P.J. Plauger의 표준 C 라이브러리 사본을 받아야합니다. 그는 표준 라이브러리의 모든 기능을 사용, 작성 및 테스트하는 방법을 알려줍니다.

일반적으로 라이브러리 코드는 코드와 마찬가지로 오브젝트 파일로 컴파일 된 다음 아카이브 형식으로 패키지됩니다. 프로그램이 링크되면 필요한 라이브러리 오브젝트가 아카이브에서 추출되어 동일한 실행 파일에 기록됩니다. 이것은 정적으로 연결된 라이브러리입니다.

동적 링크 라이브러리의 경우 라이브러리 코드 아카이브가 전체적으로 메모리에로드되고 (일반적으로 라이브러리 코드 아카이브를 사용해야하는 모든 프로그램에서 공유됩니다), 프로그램은 운영 체제의 도움을 받아 라이브러리 호출을합니다 메모리 공유를 용이하게합니다.

두 가지 유형의 라이브러리의 경우 헤더 파일에는 매크로, 유형 및 함수 원형 만 포함해야합니다. 함수 정의가 포함되어서는 안됩니다 (즉, .c 파일에 있음).

표준 라이브러리가 있기 전의 고대 버전은 printf입니다. link (< - 실제로 읽을 수 있습니다 (ish)). 이 경우

#include <stdio.h> 

printf(fmt, args) 
char *fmt; 
{ 
    _doprnt(fmt, &args, stdout); 
    return(ferror(stdout)? EOF: 0); 
} 

, _doprnt이 어셈블리 언어로 구현됩니다 호기심의 7th-edition 버전은 위의 인용 것과 같은 많은 보인다.