Why should I not #include <bits/stdc++.h>?
I posted a question with my code whose only #include
directive was the following:
#include <bits/stdc++.h>
My teacher told me to do this, but in the comments section I was informed that I shouldn't.
Why?
Including <bits/stdc++.h>
appears to be an increasingly common thing to see on Stack Overflow, perhaps something newly added to a national curriculum in the current academic year.
I imagine the advantages are vaguely given thus:
- You only need write one
#include
line - You do not need to look up which standard header everything is in
Unfortunately, this is a lazy hack, naming a GCC internal header directly instead of individual standard headers like <string>
, <iostream>
and <vector>
. It ruins portability and fosters terrible habits.
The disadvantages include:
- It will probably only work on that compiler
- You have no idea what it'll do when you use it, because its contents are not set by a standard
- Even just upgrading your compiler to its own next version may break your program
- Every single standard header must be parsed and compiled along with your source code, which is slow and results in a bulky executable under certain compilation settings
Don't do it!
More information:
- #include <bits/stdc++.h> with visual studio does not compile
- How does #include <bits/stdc++.h> work in C++?
Example of why Quora is bad:
- Is it good practice to use #include <bits/stdc++.h> in programming contests instead of listing a lot of includes?
Why? Because it is used as if it were supposed to be a C++ standard header, but no standard mentions it. So your code is non-portable by construction. You won't find any documentation for it on cppreference. So it might as well not exist. It's a figment of someone's imagination :)
I have discovered - to my horror and disbelief - that there is a well-known tutorial site where every C++ example seems to include this header. The world is mad. That's the proof.
To anyone writing such "tutorials"
Please stop using this header. Forget about it. Don't propagate this insanity. If you're unwilling to understand why doing this is Wrong, take my word for it. I'm not OK being treated as a figure of authority on anything at all, and I'm probably full of it half the time, but I'll make an exception in this one case only. I claim that I know what I'm talking about here. Take me on my word. I implore you.
P.S. I can well imagine the abominable "teaching standard" where this wicked idea might have taken place, and the circumstances that led to it. Just because there seemed to be a practical need for it doesn't make it acceptable - not even in retrospect.
P.P.S. No, there was no practical need for it. There aren't that many C++ standard headers, and they are well documented. If you teach, you're doing your students a disservice by adding such "magic". Producing programmers with a magical mindset is the last thing we want. If you need to offer students a subset of C++ to make their life easier, just produce a handout with the short list of headers applicable to the course you teach, and with concise documentation for the library constructs you expect the students to use.
There's a Stack Exchange site called Programming Puzzles & Code Golf. The programming puzzles on that site fit this definition of puzzle:
a toy, problem, or other contrivance designed to amuse by presenting difficulties to be solved by ingenuity or patient effort.
They are designed to amuse, and not in the way that a working programmer might be amused by a real-world problem encountered in their daily work.
Code Golf is "a type of recreational computer programming competition in which participants strive to achieve the shortest possible source code that implements a certain algorithm." In the answers on the PP&CG site, you'll see people specify the number of bytes in their answers. When they find a way to shave off a few bytes, they'll strike out the original number and record the new one.
As you might expect, code golfing rewards extreme programming language abuse. One-letter variable names. No whitespace. Creative use of library functions. Undocumented features. Nonstandard programming practices. Appalling hacks.
If a programmer submitted a pull request at work containing golf-style code, it would be rejected. Their co-workers would laugh at them. Their manager would drop by their desk for a chat. Even so, programmers amuse themselves by submitting answers to PP&CG.
What does this have to do with stdc++.h
? As others have pointed out, using it is lazy. It's non-portable, so you don't know if it will work on your compiler or the next version of your compiler. It fosters bad habits. It's non-standard, so your program's behavior may differ from what you expect. It may increase compile time and executable size.
These are all valid and correct objections. So why would anyone use this monstrosity?
It turns out that some people like programming puzzles without the code golf. They get together and compete at events like ACM-ICPC, Google Code Jam, and Facebook Hacker Cup, or on sites like Topcoder and Codeforces. Their rank is based on program correctness, execution speed, and how fast they submit a solution. To maximize execution speed, many participants use C++. To maximize coding speed, some of them use stdc++.h
.
Is this is a good idea? Let's check the list of disadvantages. Portability? It doesn't matter since these coding events use a specific compiler version that contestants know in advance. Standards compliance? Not relevant for a block of code whose useful life is less than one hour. Compile time and executable size? These aren't part of the contest's scoring rubric.
So we're left with bad habits. This is a valid objection. By using this header file, contestants are avoiding the chance to learn which standard header file defines the functionality they're using in their program. When they're writing real-world code (and not using stdc++.h
) they'll have to spend time looking up this information, which means they'll be less productive. That's the downside of practicing with stdc++.h
.
This raises the question of why it's worth taking part in competitive programming at all if it encourages bad habits like using stdc++.h
and violating other coding standards. One answer is that people do it for the same reason they post programs on PP&CG: some programmers find it enjoyable to use their coding skills in a game-like context.
So the question of whether to use stdc++.h
comes down to whether the coding speed benefits in a programming contest outweigh the bad habits that one might develop by using it.
This question asks: "Why should I not #include <bits/stdc++.h>
?" I realize that it was asked and answered to make a point, and the accepted answer is intended to be the One True Answer to this question. But the question isn't "Why should I not #include <bits/stdc++.h>
in production code?" Therefore, I think it's reasonable to consider other scenarios where the answer may be different.