왜 <include <bits / stdc ++. h>를 포함하지 않아야합니까?


267

#include지시어가 다음과 같은 코드로 질문을 게시했습니다 .

#include <bits/stdc++.h>

선생님은 저에게 이렇게하라고 하셨지만, 의견 섹션에서 내가해서는 안된다는 정보를 받았습니다.

왜?


72
허. using namespace std;어딘가에 포함 버전이 있다는 것을 알고 있었을 것 입니다.
user4581301

1
이 헤더가 왜 존재합니까? 분명히 많은 쓰레기를 가져올 것이기 때문에 표준을 실제로 포함하지 않는 것은 무엇입니까? 대중에 포함되지 않은 경우 ... 왜 배포판에 배송됩니까?
Chris Beck

10
@ChrisBeck : 구현 세부 사항입니다. "공용 API"의 일부가 아니거나 사용하기위한 것입니다. 그러나 여전히 배송해야합니다. 그렇지 않으면 아무것도 작동하지 않습니다. 표준 포함은 개별적으로 사용하지 않을 수도 있지만 사전 컴파일 된 헤더에 사용하기 위해 존재합니다. 맨 위에있는 주석을 참조하십시오. "이것은 사전 컴파일 된 헤더에 대한 구현 파일입니다." .
궤도에서 가벼움 경주

1
@LightnessRacesinOrbit 직접 사용하지 않을 경우 PCH에서 그 존재가 어떻게 도움이됩니까? 아니면 일부 상황에서 gcc가 PCH 목적으로 자동 전환 할 수있을 정도로 똑똑합니까?
Daniel H

2
@LightnessRacesinOrbit ""공개 API "의 일부가 아니거나 사용을위한 것입니다." 완전히 잘못된 것은 사전 컴파일 된 헤더로 공개적으로 사용하기위한 것입니다. Libstdc ++ (사전)은 해당 헤더의 사전 컴파일 된 버전을 컴파일하고 설치하므로,이를 포함하면 G ++는 실제로 bits/stdc++.h.gch사전 컴파일 된 버전을 포함합니다. 사전 컴파일 된 버전을 생성 할 수 있도록 존재해야하기 때문에 존재합니다.
Jonathan Wakely

답변:


310

포함 <bits/stdc++.h>하는 것이 스택 오버플로에서 볼 수있는 것으로 보이며, 아마도 현재 학년도에 국가 교과 과정에 새로 추가 된 것 같습니다.

나는 이점이 모호하게 주어진다고 상상한다.

  • #include줄만 작성하면 됩니다.
  • 모든 표준 헤더를 찾을 필요는 없습니다.

불행히도 이것은 게으른 핵이며 <string>, <iostream>및과 같은 개별 표준 헤더 대신 GCC 내부 헤더의 이름을 직접 지정합니다 <vector>. 휴대 성을 망치고 끔찍한 습관을 키 웁니다.

단점은 다음과 같습니다.

  • 아마도 해당 컴파일러에서만 작동합니다.
  • 내용이 표준으로 설정되어 있지 않기 때문에 사용할 때 무엇을 해야할지 전혀 모릅니다
  • 컴파일러를 다음 버전으로 업그레이드해도 프로그램이 손상 될 수 있습니다
  • 모든 단일 표준 헤더를 소스 코드와 함께 구문 분석하고 컴파일해야합니다.이 속도는 느리고 특정 컴파일 설정에서 대량 실행 파일이 생성됩니다.

하지마!


추가 정보:

Quora가 나쁜 이유의 예 :


77
맹인이 맹인 :( 선도 "아마도 뭔가 새로 현재 학년도에 국가 교육 과정에 추가"
분석 재개 모니카

14
@ KuberOber : 정확합니다.
궤도에서 가벼움

31
방금 다른 질문으로 벌레 구멍을 통해 여기 왔어요. 아주 좋습니다. 이 교습 습관을 악화시키는 것은 보통 그것을 따르는 것이 일반적 using namesapce std;이다. 두 줄만 입력하면 거의 모든 멋진 식별자가 사용됩니다. 그것이 가르치는 것을 보는 것은 매우 실망 스럽습니다.
StoryTeller-Unslander Monica 2006 년

6
quora 예제에 대해서는 시간이 지남에 따라 이동했을 수 있습니다. 오늘이 페이지를 방문했으며 온라인 프로그래밍 경연 대회의 특정 맥락에 나열된 <bits / stdc ++. h>의 장단점을 모두 방문했습니다. 나는 그들의 결론을 좋아한다.
YSC

3
@EvgeniSergeev : 2KiB는 그 효과를 판단 할 때 많은 코드, 데이터, 심볼 정보 등입니다. 추가되는 모든 것을 이해합니까? 컴파일러를 위해? 현재 릴리스? 사이에 모든 릴리스? 모든 향후 릴리스? 편리함과 정확성을 결정해야하는 경우 유효한 옵션은 하나뿐입니다.
IInspectable

47

왜? 마치 C ++ 표준 헤더 인 것처럼 사용되지만 표준에 대한 언급은 없기 때문입니다. 따라서 코드는 구성으로 이식 할 수 없습니다. cppreference 에 대한 문서는 없습니다 . 따라서 존재하지 않을 수도 있습니다. 누군가의 상상력의 조각입니다 :)

필자는 모든 C ++ 예제가이 헤더를 포함하는 것으로 알려진 잘 알려진 자습서 사이트가 있다는 사실을 공포와 불신으로 발견했다 . 세상은 화났어 이것이 증거입니다.


그런 "자습서"를 쓰는 사람에게

이 헤더 사용을 중지하십시오. 잊어 버려 이 광기를 전파하지 마십시오. 왜 이것이 잘못 되었는지 이해하지 않으 려면 내 말을 들어보십시오. 나는 어떤 것에 대한 권위의 인물로 취급되는 것은 좋지 않으며 아마도 반 시간으로 가득 차 있지만이 경우에는 예외를 만들 것입니다. 나는 내가 여기서 말하는 것을 알고 있다고 주장한다. 내 말을 들어 줘 나는 당신을 간청합니다.

추신 : 저는이 악한 생각이 일어 났을 수있는 가증스러운 "교습 표준"과 그로 인해 발생한 상황을 잘 상상할 수 있습니다. 실질적인 요구가있는 것처럼 보였기 때문에 그것을 회고하지 않아도 받아 들일 수는 없습니다.

PPS 아니요, 실질적인 필요는 없었습니다. C ++ 표준 헤더는 많지 않으며 문서화가 잘되어 있습니다. 당신이 가르치면, 당신은 그런 "마법"을 추가함으로써 학생들에게 장애를 겪고 있습니다. 마술 같은 사고 방식으로 프로그래머를 생산하는 것이 우리가 원하는 마지막 것입니다. 학생들에게 인생을 편하게하기 위해 C ++의 부분 집합을 제공해야하는 경우, 가르치는 과정에 적용 할 수있는 간단한 헤더 목록과 학생들이 사용할 라이브러리 구성에 대한 간결한 문서를 제공하는 유인물을 만드십시오.


35

Programming Puzzles & Code Golf 라는 스택 교환 사이트가 있습니다 . 해당 사이트 의 프로그래밍 퍼즐퍼즐의 다음 정의에 적합합니다 .

독창성 또는 환자의 노력으로 해결하기 어려운 문제를 제시함으로써 즐겁게 사용하도록 고안된 장난감, 문제 또는 기타 개념.

이들은 일상적인 작업에서 발생하는 실제 문제로 작업 프로그래머를 즐겁게하는 방식이 아니라 즐겁게 사용하도록 설계되었습니다.

코드 골프 는 "참가자가 특정 알고리즘을 구현하는 가장 짧은 소스 코드를 달성하기 위해 노력하는 레크리에이션 컴퓨터 프로그래밍 경쟁의 한 유형입니다." PP & CG 사이트의 답변에서 사람들이 답변에 바이트 수를 지정하는 것을 볼 수 있습니다. 그들이 몇 바이트를 깎을 수있는 방법을 찾으면, 원래 숫자를 지우고 새로운 숫자를 기록합니다.

예상대로 코드 골프는 프로그래밍 언어 남용에 대한 보상입니다. 한글자 변수 이름 공백이 없습니다. 라이브러리 기능을 창의적으로 사용합니다. 문서화되지 않은 기능. 비표준 프로그래밍 실습. 끔찍한 해킹.

프로그래머가 직장에서 골프 스타일 코드가 포함 된 풀 요청을 제출 한 경우 거부됩니다. 그들의 동료들은 그들을 비웃을 것입니다. 그들의 관리자는 채팅을 위해 책상으로 떨어질 것입니다. 그럼에도 불구하고 프로그래머는 PP & CG에 답변을 제출함으로써 스스로를 즐겁게합니다.

이것은 무엇과 관련이 stdc++.h있습니까? 다른 사람들이 지적했듯이 그것을 사용하는 것은 게으르다. 이식성이 없으므로 컴파일러 또는 다음 버전의 컴파일러에서 작동하는지 알 수 없습니다. 나쁜 습관을 키 웁니다. 비표준이므로 프로그램의 동작이 예상과 다를 수 있습니다. 컴파일 시간과 실행 파일 크기가 증가 할 수 있습니다.

이것들은 모두 유효하고 올바른 반대입니다. 그렇다면 왜이 괴물을 사용합니까?

어떤 사람들 은 코드 골프 없이 프로그래밍 퍼즐 을 좋아한다는 것이 밝혀졌다 . ACM-ICPC, Google Code Jam 및 Facebook Hacker Cup과 같은 이벤트 또는 Topcoder 및 Codeforces와 같은 사이트에서 함께 모여 경쟁합니다. 그들의 순위는 프로그램 정확성, 실행 속도 및 솔루션 제출 속도에 따라 결정됩니다. 실행 속도를 최대화하기 위해 많은 참가자가 C ++을 사용합니다. 코딩 속도를 최대화하기 위해 일부는을 사용 합니다.stdc++.h

이것이 좋은 생각입니까? 단점 목록을 확인하십시오. 이식성? 이러한 코딩 이벤트는 참가자가 미리 알고있는 특정 컴파일러 버전을 사용하므로 중요하지 않습니다. 표준 준수? 유효 수명이 1 시간 미만인 코드 블록과는 관련이 없습니다. 컴파일 시간과 실행 가능한 크기? 이것들은 컨테스트의 점수 루 브릭의 일부가 아닙니다.

그래서 우리는 나쁜 습관에 빠져 있습니다. 이것은 유효한 이의 제기입니다. 참가자는이 헤더 파일을 사용하여 프로그램에서 사용중인 기능을 정의하는 표준 헤더 파일을 배울 기회를 피할 수 있습니다. 실제 코드를 작성하고 (를 사용하지 않을 stdc++.h때)이 정보를 찾는 데 시간을 소비해야하므로 생산성이 떨어집니다. 이것이 연습의 단점입니다 stdc++.h.

이것은 stdc++.h다른 코딩 표준을 사용 하고 위반하는 것과 같은 나쁜 습관을 조장하는 경우 경쟁 프로그래밍에 참여할 가치가있는 이유에 대한 의문을 제기합니다 . 한 가지 대답은 사람들이 PP & CG에 프로그램을 게시하는 것과 같은 이유로 그렇게한다는 것입니다. 일부 프로그래머는 게임과 같은 맥락에서 코딩 기술을 사용하는 것이 즐겁다는 것을 알게됩니다.

따라서, 사용 여부에 대한 문제는 stdc++.h프로그래밍 콘테스트에서 코딩 속도 이점이 그것을 사용하여 개발할 수있는 나쁜 습관을 능가하는지 여부에 달려 있습니다.

이 질문은 "왜 #include하지 않아야 <bits/stdc++.h>합니까?" 나는 그것이 요점을 물으라는 요청과 대답을 받았으며, 받아 들여진 대답은이 질문에 대한 하나의 진정한 답이되도록 의도되었다. 그러나 문제는 "왜 <bits/stdc++.h>프로덕션 코드에 #include 를 포함 해서는 안 됩니까?"가 아닙니다. 따라서 대답이 다를 수있는 다른 시나리오를 고려하는 것이 합리적이라고 생각합니다.


5
나는 이미 공감했지만, "재미있는"것이 경쟁 프로그래밍에 참여하는 좋은 이유라고 지적 할 가치가있다. 다른 한편으로하지 않습니다 "잠재적 인 고용주를 감동"- 그것은 적극적으로 할 해가 저와 함께 귀하의 케이스를.
Martin Bonner는 Monica

2
@MartinBonner 일부 채용 관리자는 경쟁력있는 프로그래밍 경험을 적기라고 생각합니다. 그러나 최고의 소프트웨어 회사가 인터뷰에서 CP 스타일 문제를 사용하고 프로그래밍 공모전을 운영하여 신입 사원을 찾는 한 CP는 계속 주목받는 개발자들 사이에서 인기를 끌 것입니다.
RedGreenCode

@RedGreenCode 저는 관리자가 아닙니다 ($ DEITY에 감사함). 그러나 때로는 구직 고용에 영향을 미칩니다. 그리고 나는 확실히 A와 "경쟁 프로그램"에 대한 참조를 참조 거대한 - 붉은 깃발 없는 장점.
Jesper Juhl

3
@JesperJuhl 회사의 기술 면접관이 인터뷰에서 알고리즘 퍼즐을 사용하는 경우 (많은 사람이 할 수있는 경우), 이는 경쟁 프로그래밍 경험이있는 응시자에게 이점을 제공합니다. 아마도 후보에 대한 합리적인 선택은 CP에 참여하는 것이지만 이력서 / CV에 대해서는 언급하지 않는 것이 좋습니다.
RedGreenCode

2
이 헤더가 경쟁적인 프로그래밍에서 사용될 수 있다는 것은 사실이지만 그 출처는 아닙니다. 교실에서 나왔습니다. 그리고 그 교실에서 가르친 사람은 수십만 명의 학생이 아니더라도 수십만 명의 학생들을 오염시키는 데 충분한 영향을 미쳤습니다 (그때 무의식적으로 그 병을 퍼뜨린 교사들과 동료들을 교육함으로써). 그리고 이제 학생들은 튜토리얼을위한 장소로 튜토리얼을 작성하고 있습니다. 난 그냥 구석에 울고 싶어. 경쟁 프로그래밍 사이트에는 비표준 헤더를 거부 하는 정규식 이 있어야합니다 .
Monica Monica 복원

8

프로그래밍 언어 C ++의 표준 인 N4606부터 작업 초안 :

17.6.1.2 헤더 [헤더]

  1. C ++ 표준 라이브러리의 각 요소는 헤더에서 적절하게 선언 또는 정의됩니다.

  2. C ++ 표준 라이브러리는 표 14와 같이 61 개의 C ++ 라이브러리 헤더를 제공합니다.

표 14 — C ++ 라이브러리 헤더

<algorithm> <future> <numeric> <strstream>
<any> <initializer_list> <optional> <system_error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_allocator> <unordered_map>
<condition_variable> <limits> <set> <unordered_set>
<deque> <list> <shared_mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_list> <memory_resorce> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_view>

<bits / stdc ++. h>는 없습니다. <bits / ...> 헤더는 구현 세부 사항이며 일반적으로 경고를 표시하므로 이는 놀라운 일이 아닙니다.

*  This is an internal header file, included by other library headers.
*  Do not attempt to use it directly. 

<bits / stdc ++. h>에도 경고가 있습니다.

*  This is an implementation file for a precompiled header.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.