What is C++?
C++ is a (mostly) statically-typed, free-form, (usually) compiled, multi-paradigm, intermediate-level general-purpose programming language; not to be confused with C or C++/CLI. It was developed in the early 1980s by Bjarne Stroustrup, initially as a set of extensions to the C programming language. Building on C, C++ improved type-safety and added support for automatic resource management, object-orientation, generic programming, and exception handling, among other features.
New to C++?
Whether you are new to programming or coming to C++ from another programming language, it is highly recommended to have a good book from which to learn the language. We keep a detailed list of books.
If you are looking for good compilers, GCC is the most commonly used compiler on Linux and other Unix-like platforms; Clang is the official compiler on Mac and FreeBSD; Microsoft Visual C++ is the most commonly used compiler on Windows. The Intel® C++ Compiler is also commonly used for its optimized numerical computations on Windows, Linux, and Mac.
Turbo-C++ 3.0 is from 1991, extremely outdated, and definitely not recommended. See the previous paragraph for free choices from this millennium.
Join us in chat, where we discuss C++, programming in general, and even other stuff when the sun goes down and boredom creeps in. Don't forget your sense of humor, but keep it civilized.
c++ Tag usage
When posting questions about C++ programming, please make sure to include:
- Target system and compiler information. This includes the compiler name, version, and settings used to compile.
- If your question is specific to one particular version of the the language, add c++98 c++03 c++11 c++14 c++17, c++20 or c++23. Questions about boost should add the tag boost. Details about the different versions can be found further below in this wiki.
- Unless the question explicitly mentions which version of the C++ standard is used, it is assumed that the current version is used. That is, whichever version of ISO 14882 that ISO currently lists as active. Please have this in mind when answering or commenting on questions tagged c++.
Using c and c++ together
C and C++ are two distinct and often incompatible languages. Avoid using both tags in the same question unless you have good reasons.
A question should be tagged with c only, if:
- It contains pure C, with no trace of C++, or questions with code that could be either language.
- The code is compiled with a C compiler.
A question should be tagged with c++ only, if:
- It contains code with any C++ features. Even though the code may be "C style".
- The code is compiled with a C++ compiler.
A question should be tagged with both c and c++ if it is about:
- Specific differences between C and C++.
- Compatibility or porting code between C and C++.
- C++ code that uses C libraries (for example code using
Editing and moderation guidelines for posts with both c and c++ tags:
To edit/re-tag/moderate questions with both tags, it is recommended that you have full edit privileges and either a gold c or a gold c++ badge.
If you encounter a post with both tags, edit/re-tag it if needed according to the above rules. If you can tell the language by reading the posted code, simply edit tags accordingly. Avoid prompting the user "is it C or C++?" in comments unless the question is truly unclear.
One example of an unclear question is when the user explicitly claims that they are programming in C, but posts code or compiler messages for C++. If so, prompt for clarification and close-vote as unclear.
"Either C or C++ is fine" opinions from the OP is a strong indication of a poor or unclear question. Answers may be very different depending on language picked. Prompt for clarification, close as unclear/too broad until the OP has clarified this.
Be careful about re-tagging questions once there are answers posted, particularly if there are already both C and C++ answers posted. In such cases, the tags should be left alone, since changing them would make posted answers invalid.
Answers with C++ code to a C question that has never been tagged c++ should be deleted as off-topic. Please check the question edit history before flagging/deleting such answers, to verify that the question never had the C++ tag.
In 1998, the C++ standards committee published the first international standard for C++ ISO/IEC 14882:1998, which would be informally known as C++98.
In 2003, the C++ Committee responded to multiple problems that were reported with c++98, and revised it accordingly. The changed language was dubbed C++03.
The language standard remained pretty much the same for a long time, but in 2011 a new standard, C++11 (formerly known as C++0x) was published in ISO/IEC 14882:2011. Rather than in a "big bang" approach, it is being rolled out gradually as compilers are supporting the new language features. See Bjarne Stroustrup's C++11 FAQ to see what is new in the language, and check your own compiler's FAQ to see which of those features are currently supported:
- GCC language support and libstdc++ library support
- Clang language support
- Microsoft Visual C++ language and library support
- Intel language support
A few features that had been under discussion for C++11 have been deferred to the next iteration.
C++14 is a small extension to C++11. It was approved in August 2014 and released in December of the same year. Previously referred to as C++1y as the year of approval was uncertain. Many popular compilers already have some level of C++14 support.
- GCC C++14 language support
- Clang C++14 language support
- Intel C++14 language support
- Microsoft Visual C++ C++14 language support
C++17 adds a few more major features (and several minor ones). It is usually referred to as C++1z or C++17, as technical work on the new standard was completed in March of 2017. The draft standard was approved (unanimously) by the ISO in September of 2017 and officially published in December 2017.
- GCC C++17 language support
- Microsoft Visual C++ C++17 language support
- Clang C++17 language support
- Intel C++17 language support
In February 2020 the C++ Standard committee completed work on C++20. It was unanimously approved later that year and got officially published in December 2020.
The following (and more) new features have already been accepted into the C++20:
three-way comparison using the new (spaceship) operator
designated initializers (based on the C99 feature with a few limitations)
generic lambdas (template parameter lists on lambda expressions)
initialization statement within a range-based
chrono library update : new clocks, civil calendar, time zones, formatting to string and parsing
pack expansions in lambda init-capture
concepts - requires expressions, template constraints, concepts library
improvements to Concurrency and adding coroutines
GCC C++20 language support add command line parameter
-std=c++2ain GCC 9 and earlier)
Clang C++20 language support add command line parameter
-std=c++2ain Clang 9 and earlier)
The following (and more) new features have already been accepted into the C++23 draft:
Clang C++23 language support add command line parameter
-std=c++2bfrom Clang 12 onwards
If you want to give C++ a spin, you can try one of the following online compiler services:
- Coliru (GCC, Clang)
- ideone.com (GCC, Clang)
- codepad (GCC)
- rextester (GCC, Clang, Visual C++)
- repl.it (GCC)
- ELLCC (Clang)
- CodingGround (GCC)
- C++Shell (GCC)
- Wandbox (GCC, Clang)
- Compiler Explorer (GCC, Clang, ICC, Visual C++). Many versions of GCC/Clang for x86, and also for some non-x86 architectures (ARM, ARM64, PPC, and AVR), as well as latest versions of Microsoft Visual C++. Beside execution (./a.out button), it includes nicely formatted assembler output, even optionally color-highlighting source and assembler lines to help find which source line maps to which assembler line.
- C++ Insights (Clang) Trans-compiler of code that shows the C++98 code that maps on modern constructs
- Quick bench (GCC, Clang) Micro benchmarking tool intended to quickly and simply compare the performances of code snippets.
Stack Overflow's C++ FAQ
- How do I iterate over the words of a string?
- When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?
- What does the explicit keyword mean?
- What is The Rule of Three?
- What are the differences between a pointer variable and a reference variable in C++?
- What is the copy-and-swap idiom?
- Do the parentheses after the type name make a difference with new?
- Why should C++ programmers minimize use of 'new'?
- The Definitive C++ Book Guide and List
- Where do I find the current C or C++ standard documents?
- Undefined, unspecified and implementation-defined behavior
- How undefined is undefined behavior?
- What is an undefined reference/unresolved external symbol error and how do I fix it?
- Definitive List of Common Reasons for Segmentation Faults
- Why does std::getline() skip input after a formatted extraction?
- Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?
- Why is "using namespace std;" considered bad practice?
- ISOCPP unified modern C++ FAQ, successor to Marshall Cline’s online C++ FAQ Lite
- C++ Templates FAQ
- Bjarne Stroustrup's C++ Style and Technique FAQ
- Bjarne Stroustrup's C++11 FAQ
Other External Resources
ISO C++ website
C++ Core Guidelines
cplusplus: reference, tutorials, and history
Guru of the Week: article series on high-quality, exception-safe C++ code
Revised Guru of the Week (for C++1y)
More C++ Idioms
Boost C++ Libraries (boost)
Optimization resources for x86, including C++ intrinsics for vector instructions: See the x86 tag wiki for links
Agner Fog's Optimization guide for C/C++
Working Draft, Standard for Programming Language C++
- C++ Questions and Answers
- Lounge C++