#include <bits / stdc ++. h>는 왜 안되나요?
유일한 #include
지시문이 다음과 같은 코드로 질문을 게시했습니다 .
#include <bits/stdc++.h>
선생님이 이렇게하라고 하셨지만 댓글란에서해서는 안된다는 안내를 받았습니다.
왜?
답변
포함 <bits/stdc++.h>
은 Stack Overflow에서 점점 더 일반적으로 나타나는 것으로 보입니다. 아마도 현재 학년도에 국가 커리큘럼에 새로 추가 된 것입니다.
나는 이점이 모호하게 주어진다고 생각합니다.
- 한
#include
줄만 작성하면 됩니다. - 모든 것이 어떤 표준 헤더에 있는지 조회 할 필요가 없습니다.
불행히도 이것은 게으른 해킹으로 <string>
,, <iostream>
및 같은 개별 표준 헤더 대신 GCC 내부 헤더의 이름을 직접 지정합니다 <vector>
. 그것은 이식성을 파괴하고 끔찍한 습관을 조장합니다.
단점은 다음과 같습니다.
- 아마도 해당 컴파일러에서만 작동합니다.
- 그 내용이 표준에 의해 설정되지 않았기 때문에 당신은 그것을 사용할 때 무엇을할지 전혀 모릅니다.
- 컴파일러를 다음 버전으로 업그레이드하는 것만으로도 프로그램이 손상 될 수 있습니다.
- 모든 단일 표준 헤더는 소스 코드와 함께 구문 분석 및 컴파일되어야합니다. 이는 속도가 느려지고 특정 컴파일 설정에서 실행 파일이 부피가 커지게됩니다.
하지마!
추가 정보:
- #include <bits / stdc ++. h> with Visual Studio가 컴파일되지 않습니다.
- #include <bits / stdc ++. h>는 C ++에서 어떻게 작동합니까?
Quora가 나쁜 이유의 예 :
왜? C ++ 표준 헤더 인 것처럼 사용되지만 표준에 언급되어 있지 않기 때문입니다. 따라서 코드는 구성으로 이식 할 수 없습니다. cppreference 에서 이에 대한 문서를 찾을 수 없습니다 . 따라서 존재하지 않을 수도 있습니다. 누군가의 상상력의 산물입니다 :)
나는 모든 C ++ 예제가이 헤더를 포함하는 것으로 보이는 잘 알려진 튜토리얼 사이트가 있다는 것을 공포와 불신으로 발견했습니다 . 세상은 미쳤습니다. 그것이 증거입니다.
그런 "가이드"를 쓰는 사람에게
이 헤더 사용을 중지하십시오. 잊어 버려. 이 광기를 전파하지 마십시오. 이것이 잘못된 이유를 이해하고 싶지 않다면 제 말을 믿으 십시오. 나는 어떤 것에 대한 권위의 인물로 취급되는 것은 전혀 괜찮지 않으며 아마도 절반의 시간으로 가득 차있을 것입니다. 그러나이 경우에만 예외를 만들 것입니다. 나는 내가 여기서 무슨 말을하는지 안다고 주장한다. 내 말을 믿으세요. 간청합니다.
추신 : 나는이 사악한 생각이 일어 났을 수있는 가증스러운 "가르침 표준"과 그로 이어진 상황을 잘 상상할 수 있습니다. 실제적인 필요가있는 것 같았다고해서 받아 들일 수있는 것은 아닙니다. 돌이켜 보더라도 말입니다.
PPS 아니요, 실질적인 필요가 없었습니다. C ++ 표준 헤더는 많지 않으며 잘 문서화되어 있습니다. 가르친다면 그러한 "마법"을 추가함으로써 학생들에게 해를 끼치는 것입니다. 마법 같은 사고 방식으로 프로그래머를 만드는 것이 우리가 원하는 마지막 일입니다. 학생들에게 생활을 더 쉽게하기 위해 C ++의 하위 집합을 제공해야하는 경우 가르치는 과정에 적용 할 수있는 짧은 헤더 목록과 학생들이 사용할 것으로 예상되는 라이브러리 구성에 대한 간결한 문서가 포함 된 유인물을 만드십시오.
Programming Puzzles & Code Golf 라는 Stack Exchange 사이트가 있습니다 . 해당 사이트 의 프로그래밍 퍼즐 은 다음과 같은 퍼즐 정의에 적합합니다 .
독창성이나 인내심의 노력으로 해결해야 할 어려움을 제시하여 즐겁게 고안된 장난감, 문제 또는 기타 인위적인 것.
그들은 일상적인 작업에서 발생하는 실제 문제에 의해 일하는 프로그래머가 즐겁게 지내는 방식이 아니라 재미있게 설계되었습니다.
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하지 않아야 합니까?"가 아닙니다. 따라서 답변이 다를 수있는 다른 시나리오를 고려하는 것이 합리적이라고 생각합니다.
N4606, Working Draft, Standard for Programming Language C ++ :
17.6.1.2 헤더 [헤더]
C ++ 표준 라이브러리의 각 요소는 헤더에서 선언되거나 적절하게 정의됩니다.
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.
사용하지 않는 이유 :
#include <bits/stdc++.h>
효율성 때문입니다. 비유를 해보겠습니다. Java를 아는 분들을 위해 : 강사에게 다음이 좋은 생각인지 물었다면, 나쁜 강사가 아니라면 그들은 거절 할 것입니다.
import java.*.*
#include ...는 기본적으로 똑같은 일을합니다 ... 그것은 그것을 사용하지 않는 유일한 이유는 아니지만 사용하지 않는 주요 이유 중 하나입니다. 실제 비유를 위해 : 도서관이 있고 도서관에서 책 두 권을 빌리고 싶다고 가정 해보십시오. 도서관 전체를 집 옆으로 옮기시겠습니까 ?? 비싸고 비효율적입니다. 책 5 권만 필요하다면 5 권만 꺼내세요. 도서관 전체가 아니라 .....
#include <bits/stdc++.h>
프로그램에 익숙해 보이지만 include 문 하나만 입력하면되며 전체 라이브러리를 이동하는 것과 똑같이 작동합니다. 5 권의 책 대신 하나의 전체 라이브러리 만 이동하면됩니다. 실제로 이사를해야하는 사람에게 확신이있는 것 같네요 ?? 그다지 많지 않습니다. C ++에서 이동하는 사람이 귀하의 컴퓨터가 될 것입니다 ... 컴퓨터는 작성하는 모든 소스 파일에 대해 전체 라이브러리를 이동하는 것을 좋아하지 않습니다. :) .....