내가 #include하지 않아야하는 이유 <bits stdc++.h=""></bits>

c++ portability turbo-c++ c++-faq implementation-defined-behavior


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

#include <bits/stdc++.h>

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

Why?




Answer 1 Lightness Races in Orbit


포함 <bits/stdc++.h> 스택 오버플로에 볼 수있는 점점 더 일반적인 것, 새로 현재 학년도에 국가 교육 과정에 추가 아마도 뭔가 것으로 보인다.

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

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

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

단점은 다음과 같습니다.

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

하지마!


추가 정보:

Quora가 나쁜 이유의 예 :




Answer 2 Reinstate Monica


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

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


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

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

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

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




Answer 3 RedGreenCode


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> 를 포함 시키지 말아야 합니까?" 따라서 답이 다른 다른 시나리오를 고려하는 것이 합리적이라고 생각합니다.




Answer 4 Bulletmagnet


프로그래밍 언어 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.