#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> を含めることは、おそらく現在の学年度の国家カリキュラムに新しく追加されたものであると思われる、Stack Overflowでますます一般的になるようです。

メリットはこうして漠然と与えられているのではないかと想像しています。

  • #include 行を1つ書くだけです
  • すべてのものがどの標準ヘッダにあるかを調べる必要はありません。

残念ながら、これは遅延ハックであり、 <string><iostream><vector> のような個々の標準ヘッダーではなく、GCC内部ヘッダーに直接名前を付けます。移植性を台無しにし、ひどい習慣を助長します。

デメリットとしては、以下のようなものがあります。

  • おそらくそのコンパイラでしか動作しないでしょう
  • 使ってみても何をするかわからない、というのは、その内容が標準的な
  • コンパイラを独自の次のバージョンにアップグレードするだけでも、プログラムが壊れてしまう可能性があります。
  • すべての標準ヘッダはソースコードと一緒に解析してコンパイルしなければなりませんが、特定のコンパイル設定の下では遅く、結果的に実行ファイルがかさばることになります。

やめろ!


詳細はこちら

Quoraが悪い理由の例。




Answer 2 Reinstate Monica


どうして?C ++の標準ヘッダーであるかのように使用されているが、標準で言及されていないため。そのため、コードは構造上、移植不可能です。cppreferenceにドキュメントはありません。したがって、存在しない可能性もあります。それは誰かの想像力の象徴です:)

私は、私の恐怖と信じられないことに、すべてのC ++の例にこのヘッダーが含まれているように見える有名なチュートリアルサイトがあることを発見しました。世界は狂っています。それが証明です。


そんな「チュートリアル」を書いている方へ

このヘッダーの使用を中止してください。気にしないで。この狂気を広めないでください。なぜこれが間違っているのかを理解したくない場合は、私の言葉を信じてください。私は何に対しても権威のある人物として扱われることはまったく問題であり、おそらく半分の時間でそれで満たされていますが、この1つの場合にのみ例外を設けます。私はここで私が話していることを知っていると主張します。私の言葉を聞いてください。お願いします。

追伸:この邪悪な考えが行われたであろう忌まわしい「教育基準」と、それに至るまでの状況はよく想像できます。実用的な必要性があったと思われるからといって、それが受け入れられるわけではありません-振り返ってみても、そうではありません。

P.P.S.いいえ、実用的な必要性はありませんでした。C++の標準ヘッダはそれほど多くはありませんし、よく文書化されています。もしあなたが教えているのであれば、このような「魔法」を追加することで、あなたは生徒に不利益を与えていることになります。魔法のような考え方を持ったプログラマを輩出することは、私たちが望んでいることではありません。学生の生活を楽にするために C++のサブセットを提供する必要がある場合は、あなたが教えるコースに適用可能なヘッダの短いリストと、学生が使用することを期待しているライブラリ構成の簡潔なドキュメントを含むハンドアウトを作成すればよいのです。




Answer 3 RedGreenCode


Programming Puzzles&Code Golf」というStack Exchangeサイトがあります。そのサイトのプログラミングパズルは、次のパズルの定義に適合しています。

工夫や忍耐力で解決できる困難を提示して楽しませようとしています。

彼らは楽しませるために設計されており、プログラマーが日々の仕事の中で遭遇する現実世界の問題を楽しませるような方法ではありません。

コードゴルフは「参加者が特定のアルゴリズムを実装する最短のソースコードを達成するために努力するレクリエーションのコンピュータプログラミングコンテストの一種です。」PP&CGサイトの回答では、回答のバイト数を指定しているのがわかります。彼らが数バイトを削り取る方法を見つけたとき、彼らは元の数を取り除き、新しいものを記録します。

お察しの通り、コードゴルフは極端なプログラミング言語の乱用に報います。1文字の変数名 空白なし。ライブラリ関数の独創的な使用。文書化されていない機能 標準外のプログラミング方法。驚愕のハック

プログラマーがゴルフ形式のコードを含む職場でプルリクエストを送信した場合、そのリクエストは拒否されます。彼らの同僚は彼らを笑いました。彼らのマネージャーはチャットのために机に立ち寄ります。それでも、プログラマーはPP&CGに回答を送信することで自分自身を楽しませます。

これは stdc++.h とどのように関係していますか?他の人が指摘したように、それを使用するのは面倒です。移植性がないため、コンパイラで動作するか、コンパイラの次のバージョンで動作するかはわかりません。悪い習慣を助長します。これは非標準であるため、プログラムの動作は予想と異なる場合があります。コンパイル時間と実行可能ファイルのサイズが増える可能性があります。

これらはすべて有効で正しい反論です。ではなぜ誰もがこの怪物を使うのか?

コードゴルフなしでパズルプログラミングするのが好きな人もいることがわかります。彼らは集まり、ACM-ICPC、Google Code Jam、Facebook Hacker Cupなどのイベント、またはTopcoderやCodeforcesなどのサイトで競争します。それらのランクは、プログラムの正確さ、実行速度、およびソリューションの提出速度に基づいています。実行速度を最大にするために、多くの参加者がC ++を使用しています。コーディング速度を最大にするために、 stdc++.h 使用するものもあります。

これは良いことなのか?デメリットを一覧で確認してみましょう。移植性?これらのコーディングイベントでは、出場者が事前に知っている特定のコンパイラのバージョンを使用しているので、問題ではありません。標準に準拠しているか? 有用期間が1時間未満のコードブロックには関係ありません。コンパイル時間と実行可能サイズ? これらはコンテストの採点基準には含まれていません。

だから私たちは悪い習慣に取り残されています。これは有効な異論です。このヘッダーファイルを使用することにより、参加者は、プログラムで使用している機能を定義している標準ヘッダーファイルを知る機会を避けています。 stdc++.h を使用せずに実際のコードを記述しているときは、この情報の検索に時間を費やす必要があるため、生産性が低下します。これが stdc++.h で練習することの欠点です。

これは、 stdc++.h を使用したり、他のコーディング標準に違反したりするような悪い習慣を助長するのであれば、なぜ競争プログラミングに参加する価値があるのか​​という疑問を提起します。その答えの1つは、PP&CGにプログラムを投稿するのと同じ理由で人々がそうすることです。一部のプログラマーは、ゲームのようなコンテキストでコーディングスキルを使用するのが楽しいと感じています。

したがって、 stdc++.h を使用するかどうかの問題は、プログラミングコンテストでのコーディング速度の利点が、それを使用することで開発される可能性のある悪い習慣を上回っているかどうかに帰着します。

この質問は、「なぜ <bits/stdc++.h> すべきではないのですか?」と尋ねます。私はそれがポイントを作るために尋ねられて答えられたことを理解し、受け入れられた答えはこの質問に対する唯一の真の答えとなることを意図しています。しかし、問題は「なぜプロダクションコードに#includes <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.