2011-12-01 5 views
1

표준 라이브러리의 정의는 어디에서 소스 파일을 찾을 수 있는지 누가 알 수 있습니까?
예를 들어, 에 프로토 타입 화 된 함수의 정의가 들어있는 string.c 파일은 어디에 있습니까? 그리고 무엇보다도, 그것은 존재합니까?라이브러리 정의는 어디에 있습니까?

+1

귀하의 컴파일러에 따라 다릅니다. – Abyx

+2

http://ftp.gnu.org/gnu/libc/ – nmichaels

+2

glibc 소스 코드는 http://sourceware.org/git/?p=glibc.git에 있습니다. – pmg

답변

3

모두 컴필레이션 된 상태로, 일부는 asm으로 최적화 될 수 있습니다. 정의를 보려면 컴파일러 소스가 필요합니다.

+1

모두 컴파일 상태가 아닙니다. 'string'을 고려하십시오. –

+1

@ John Dibling, 동의합니다! 나는 C- 함수를 의미한다. – triclosan

3

오픈 소스 인 GCC의 경우 미러 사이트 here에서 libstdC++ 라이브러리의 소스를 다운로드 할 수 있습니다. 다운로드에는 std 라이브러리의 소스가 포함됩니다. 다른 벤더들은 서로 다른 구현을 할 것이기 때문에 GCC의 개발자들이 표준 라이브러리를 구현하기로 결정한 것일뿐입니다.

2

아마 이것을 좋아할 것입니다.

C++ 표준은 표준 라이브러리에서 실제로 구현 된 부분을 구체적으로 말하지 않습니다. . 일이 하지만 예를 들어, 표준 말한다는 이름 당신의 이름을 가져다하기 위해 #include해야합니다 파일 (들) 정도에,를 선언하는 곳은 말한다 :

std::string

basic_string<...>의 경우 typedef이며 프로그램에 typedef을 가져 오려면 #include <string>이 필요합니다. 실제로는 basic_string 또는 string<string>에 정의되어 있으며 하드 드라이브의 어느 위치에서든 <string>도 위치한다고 말하지는 않습니다. 사실 현실 세계에서는 종종 <string>에 들어 있지 않습니다. 내 구현에서는, (MSVC10는) string 다른 파일, 에 정의되어, 그것은 다음과 같습니다

typedef basic_string<char, char_traits<char>, allocator<char> > 
    string; 

유용한, 응?

또 다른 측면이 있습니다. 표준 라이브러리의 많은 내용은 string과 같은 템플릿 항목이므로 C++에서 템플릿이 작동하는 방식 때문에 이러한 기능은 소위 "포함 라이브러리"여야합니다. 그러나 표준 라이브러리의 모든 내용이 템플릿으로 구성되어있는 것은 아닙니다.

sprintf을 고려하십시오. 표준에 따르면이 선언은 #include <cstdio>에 의해 제공되지만 string과 같이 선언 된 곳이 아닙니다. 그리고 sprintf은 템플릿 일이 아닙니다. 구현은 CRT (C Runtime Library)라고도합니다. 이것은 sprintf과 같은 코드를 실행하기 위해 프로그램이 링크하는 DLL과 LIB (MSVC10의 어쨌든) 모음입니다.

이제 나쁜 소식은 CRT에있는 구성 요소가 일반적으로 소스 코드없이 제공된다는 것입니다. sprintf이 구현되어 있고 소스 코드를 볼 수없는 경우 사용자는 알 수 없습니다. MicroSoft에서 일하는 것을 제외하고는 소스 코드를 살펴볼 수있는 경우가 거의 없습니다. :)

+1

5 년 전 (또는 10 년 전에) 인터넷에 어딘가에있는 CRT (실제로는 전체 윈도우)의 소스 코드가 있었다. 하지만 나는 개인적으로 GNU, uclibc 등을 볼 것입니다. 뭔가 MS의 sprintf 구현을 보는 것이 어쨌든 쓸모 없다고합니다. –

관련 문제