2013-12-14 2 views
0

그래, 제목에 질문. 그러나 왜 물어 보는 이유는 The New Boston에서 비디오 튜토리얼을 가져 가고 있기 때문입니다. 왜 우리는 도서관을 직접 가져와야합니까? 그리고 모든 프로그래머가 만든 C++의 모든 lib를 의미하는 것은 아니지만 cstdlib 또는 cmath와 같이 가장 일반적으로 사용되는 라이브러리는 무엇입니까?시작시 모든 C++ 라이브러리가 자동으로 포함되지 않는 이유는 무엇입니까?

+3

왜 구문 분석과 컴파일러가 필요하지 않을 수도있는 컴파일 작업을 방해합니까? – jrok

+0

"라이브러리 가져 오기"란 무엇을 의미합니까? 표준 C 및 C++ 라이브러리는 기본적으로 프로그램에 링크되어 있습니다. –

+0

** 단순한 ** 대답은 컴파일러가 모든 표준 .h를 읽어야한다는 것입니다. –

답변

1

두 가지가 있습니다. 응용 프로그램을 빌드하면 빌드 시스템이 표준 라이브러리에 링크되고 링커는 해당 라이브러리에서 필요한 코드와 사용자가 지정한 다른 코드를 가져옵니다.

은 당신이 여기에 대해 얘기하는 것은 하지 라이브러리,하지만 헤더입니다. 헤더는 소스 파일의 내용을 설명하므로 소스 파일을 컴파일하고 다른 곳에서 정의 된 내용을 참조 할 수 있습니다. 예를 들어,

#include <stdio.h> 

int main() { 
    puts("Hello, world"); 
    return 0; 
} 

헤더 <stdio.h>는 인수로 문자열 리터럴 ("Hello, world\n")로 호출 할 수 puts라는 기능이 있다는 컴파일러를 알려줍니다. 이 함수는 표준 라이브러리에 정의되어 있으므로 표준 라이브러리에 연결하면이 작업을 수행하는 코드가 생성됩니다.

Java와 달리 C++ 설계자는 컴파일러가 하드 드라이브를 통과하여 코드에서 사용하려는 것을 파악하려고 시도하지 않기로 결정했습니다. 당신은 그것을 말해야하며, 헤더는 그것을하기위한 메커니즘입니다. 필요한 것보다 많은 헤더를 사용하면 필요한 것보다 더 많은 텍스트를 처리한다는 것을 의미하며, 이는 다시 컴파일 속도가 느려짐을 의미합니다.

+0

아, 그래서 특정 libs 특정 제목이 있고 그 libs 중 하나는 당신에게 (기능)를 제공하는 헤더입니다. 그래서 컴파일러는 추측 할 수있는 카탈로그와 같습니다. 그것은

에 가야하고, 다시 말하자면, 초기화 경로를 말한 다음 그 시작점에서 다른 헤더를 가져 가야합니까? 다른 질문을해도 좋을지 모르지만 lib 디렉토리는 헤더의 모음일까요? 그렇다면 어떤 라이브러리를 사용해야하는지/어떻게 호출해야 하는지를 어떻게 알 수 있습니까? 많은 감사합니다. -James. –

+0

헤더는 텍스트 파일입니다. 컴파일러가'#include whatever'을 보았을 때 컴파일하는 파일의 일부분 인 것처럼 그 파일에서 텍스트를 읽습니다. 아무것도 더. 이 시점에서 헤더와 라이브러리의 세부 사항을 무시하는 것이 좋습니다. 나중에 하나 이상의 소스 파일로 구성된 프로그램을 작성하기 시작할 것이고, 그렇게 할 때 헤더와 링크에 대해 모두 배우게됩니다. –

+0

달콤한, 건배 남자, 도움을 주셔서 감사합니다. 프로그래밍을 시작하기가 어렵습니다 (알고 계시 겠지만). 자신에게 도움이 될만한 지침을 제공하는 사람들이 있습니다. –

2

라이브러리를 포함하면 비용이 발생합니다. 그들의 기호는 컴파일에 더 오래 걸리고 결과물을 더 크게 만듭니다. 일부 라이브러리의 이름은 다른 라이브러리의 이름과 충돌하거나 자체 코드의 이름과 충돌 할 수 있습니다. '가져 오기'가 자동으로 이루어지면 어떻게 가져올 수 있습니까? "일반적으로 사용되는"것이 무엇인지 누가 결정합니까? 나는 거의 C++ 프로젝트에서 stdlib을 사용하지 않는다. 때때로 수학을 사용하지만 자주 사용하지는 않습니다.

"패키지"가 기본적으로 가져 오는 언어는 생각할 수 없습니다. (Java, C#, Python, C/C++)

+0

java.lang'은 자동으로 가져 왔습니까? 파이썬 2에서는'예외 '의 내용이 있지만 파이썬 3에서는 그냥 내장 된 것입니다. –

0

표준 C++ 라이브러리 헤더도 자동으로 포함되지 않는 이유는 컴파일 시간이 상당히 길어지기 때문입니다. 헤더 파일을 포함 시키려면 내용을 #include 문에 붙여 넣기 만하면되므로 포함 된 코드가 실제로 필요하지는 않더라도 매우 긴 번역 단위로 끝낼 수 있습니다.

0

문제는 모든 것을 포함하면 컴파일러가 프로젝트를 구문 분석하고 컴파일하는 데 훨씬 오래 걸리는 것입니다. stl이 주로 템플릿으로 작성되기 때문에 때로는 특히 mpl (메타 템플릿 프로그램)의 경우 엉덩이에 통증이 있습니다.

하지만 가장 일반적인 라이브러리를 고려하여 새 프로젝트를 설정할 때마다 가져올 수 있습니다.

0

"가져 오기"는 올바른 용어가 아닙니다. 라이브러리의 헤더 파일이없는 라이브러리는 "include"d됩니다. #include 파일은 다른 기능 및 기타 유용한 정의의 서명에 대해 컴파일러에 알립니다. Sun의 모든 것을 자동으로 포함 시키면 컴파일러의 작업이 늘어나고 컴파일 시간이 길어집니다. 또한 컴파일러가 더 많은 메모리를 필요로합니다. 추가적인 이점은 컴파일러 이 적절한 헤더가 제공 될 때 프로그래머의 의도를 알고 있다는 것입니다.

C/C++은 더 작은 코드 풋 프린트로 코드를 엄격하게 유지하려고합니다. 그들은 메모리 사용을 가능한 한 가장 효율적으로 유지하기를 원하며 그 철학은 컴파일러에도 반영됩니다.

관련 문제