Programing

#include는 어떻게

crosscheck 2020. 8. 8. 10:40
반응형

#include는 어떻게 C ++에서 작동합니까? [복제]


이 질문에 이미 답변이 있습니다.

나는 codeforces 블로그에서 우리 #include <bits/stdc++.h>C++프로그램에 있다면 다른 헤더 파일을 포함 할 필요가 없다는 것을 읽었습니다 . 어떻게 #include <bits/stdc++.h>작동하며 개별 헤더 파일을 포함하는 대신 사용해도 괜찮습니까?


기본적으로 모든 표준 라이브러리와 stl 포함 파일을 포함하는 헤더 파일입니다. 내가 볼 수있는 유일한 목적은 테스트와 교육을위한 것입니다.

예 : GCC 4.8.0 /bits/stdc++.h 소스 .

이를 사용하면 불필요한 내용이 많이 포함되고 컴파일 시간이 늘어납니다.

편집 : Neil이 말했듯이 미리 컴파일 된 헤더에 대한 구현입니다. 사전 컴파일을 위해 올바르게 설정하면 실제로 프로젝트에 따라 컴파일 시간이 빨라질 수 있습니다. ( https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html )

그러나 각 sl / stl 헤더에 대해 배우는 데 시간을 할애하고 대신 별도로 포함하고 사전 컴파일 목적을 제외하고는 "슈퍼 헤더"를 사용하지 않는 것이 좋습니다.


#include <bits/stdc++.h> 미리 컴파일 된 헤더의 구현 파일입니다.

소프트웨어 엔지니어링 관점에서 포함을 최소화하는 것이 좋습니다. 사용하는 경우 실제로 많은 파일이 포함되어 프로그램에 필요하지 않을 수 있으므로 컴파일 시간과 프로그램 크기를 불필요하게 늘립니다. [편집 : @Swordfish가 지적한대로 출력 프로그램 크기는 영향을받지 않습니다. 그러나 경쟁 경쟁이 아니라면 실제로 필요한 라이브러리 만 포함하는 것이 좋습니다.]

그러나 콘테스트에서이 파일을 사용하는 것은 집안일에 낭비되는 시간을 줄이고 싶을 때 좋은 생각입니다. 특히 순위가 시간에 민감한 경우.

ACM-ICPC (Sub-Regionals, Regionals 및 World Finals) 및 많은 온라인 심사 위원을 포함한 대부분의 온라인 심사 위원, 프로그래밍 컨테스트 환경에서 작동합니다.

그것의 단점은

  • 컴파일 시간이 늘어납니다.
  • GNU C ++ 라이브러리의 내부 비표준 헤더 파일을 사용하므로 MSVC, XCode 및 기타 여러 컴파일러에서 컴파일되지 않습니다.

이 헤더 파일은 C ++ 표준의 일부가 아니므로 이식 할 수 없으므로 피해야합니다.

또한 표준에 포괄 헤더가 있더라도 컴파일러는 매번 포함 된 모든 헤더 (재귀 적으로 포함 된 헤더 포함)를 실제로 읽고 구문 분석해야하므로 특정 헤더 대신이를 피하고 싶을 것입니다. 번역 단위가 컴파일됩니다.


기본적으로 모든 표준 라이브러리를 포함하는 헤더 파일입니다. 프로그래밍 대회에서이 파일을 사용하는 것은 집안일에 낭비되는 시간을 줄이고 싶을 때 좋은 생각입니다. 특히 순위가 시간에 민감한 경우. 프로그래밍 대회에서 사람들은 소프트웨어 엔지니어링보다 문제를 해결하기위한 알고리즘을 찾는 데 더 집중합니다. 소프트웨어 엔지니어링 관점에서 포함을 최소화하는 것이 좋습니다. 실제로 사용하면 프로그램에 필요하지 않을 수있는 많은 파일이 포함되므로 컴파일 시간과 프로그램 크기가 불필요하게 증가합니다. \

자세한 내용은 https://www.geeksforgeeks.org/bitsstdc-hc/ 를 방문 하십시오.

이것은 순위가 많이 중요한 온라인 코딩에 가장 적합합니다.


불행히도 그 접근법은 (지금까지) 이식 가능한 C ++가 아닙니다.

모든 표준 이름은 네임 스페이스에 std있으며 포함 및 헤더에 의해 정의 되지 않은 이름을 알 수 없습니다 (즉, 구현에서를 std::string사용할 때 이름을 직접 또는 간접적으로 선언하는 것이 완벽하게 합법적입니다 #include <vector>).

그럼에도 불구하고 어떤 표준 헤더가 표준 라이브러리의 어떤 부분을 포함하는지 컴파일러에게 알고 알려주는 언어가 필요합니다. 예를 들어 잊어 버리지 #include <map>만 사용 std::map하면 프로그램이 특정 컴파일러의 특정 버전에 대한 경고없이 자동으로 컴파일 될 수 있으며 나중에 다른 컴파일러 또는 버전으로 이식 할 때만 오류가 발생할 수 있기 때문에 이식성 버그의 원인입니다 .

제 생각에는 이것이 일반 사용자에게 필요하기 때문에 유효한 기술적 변명은 없습니다. 컴파일러 바이너리는 모든 표준 네임 스페이스를 내장 할 수 있으며 이는 실제로 미리 컴파일 된 헤더보다 성능을 더 높일 수 있습니다 (예 : 조회에 완벽한 해싱 사용, 표준 제거 헤더 파싱 또는로드 / 디 마샬링 등).

표준 헤더를 사용하면 컴파일러 또는 표준 라이브러리를 빌드하는 사람의 수명이 단축됩니다. 사용자를 돕는 것은 아닙니다.

그러나 이것은 언어가 정의되는 방식이며 어떤 헤더가 어떤 이름을 정의하는지 알아야하므로 일부 추가 뉴런이 무의미한 구성으로 연소되도록 계획하여이를 기억하십시오 (또는 사용하는 표준 헤더를 자동으로 추가하는 IDE 및 IDE를 찾아보십시오. 당신이하지 않는 ... 합리적인 대안을 제거합니다).


기본적으로 모든 표준 라이브러리를 포함하는 헤더 파일입니다.
경연 프로그램 이 파일을 사용하면 집안일을하고 낭비 시간을 단축 할 좋은 아이디어이다; 특히 순위가 시간에 민감한 경우.
경연 프로그램 , 사람들은 소프트웨어 엔지니어링에보다 문제를 해결하기 위해 알고리즘을 찾는 데 집중할 않습니다.
그러나 소프트웨어 엔지니어링 관점에서 사용하는 것은 좋은 생각이 아닙니다. 사용하는 경우 실제로 프로그램에 필요하지 않을 수있는 많은 파일이 포함되어 있으므로 컴파일 시간과 프로그램 크기가 불필요하게 증가합니다.

참고 URL : https://stackoverflow.com/questions/25311011/how-does-include-bits-stdc-h-work-in-c

반응형