Question

Finding C and C++ Standard Documents: Official Copies and Free Drafts

ccppstandardsc++-faq

Question

Many programming questions refer to “the standard” as the authoritative source. Where can I find the C and C++ standard documents, preferably online?

In particular, I want reliable resources for these historical language editions:

  • C89, C99, and C11
  • C++98, C++03, C++11, C++14, and C++17

How do official standards differ from freely available drafts and reference websites?

Short Answer

C and C++ are standardized by ISO/IEC. The official published standards are usually paid documents obtained from ISO or a national standards body, while committee working drafts and issue papers are commonly available for free. This page shows how to identify a standard edition, locate authoritative sources, and use free material appropriately.

Concept

C and C++ language rules are defined by ISO/IEC standards. A standard is a versioned specification: it describes valid syntax, semantics, library facilities, and requirements for conforming implementations.

For example:

  • C11 is ISO/IEC 9899:2011.
  • C++17 is ISO/IEC 14882:2017.

The word “standard” can mean different documents in discussions, so it is important to distinguish them:

  • Published ISO standard: The final, normative document. This is the legal and technical authority for a particular edition.
  • Committee draft: A pre-publication document maintained by the C or C++ standards committee. It is useful and often very close to a final standard, but it is not automatically the published edition.
  • Proposal or paper: A document suggesting a change. It may be accepted, rejected, or changed before publication.
  • Reference website: A convenient explanation or index, but not necessarily the legal wording of the standard.

This distinction matters when behavior is subtle. A compiler, book, or forum post may summarize a rule incorrectly, use a rule from a newer edition, or describe a proposed feature that was never adopted.

Mental Model

Think of a language standard as an official rulebook for a sport.

  • The published ISO document is the final rulebook sold by the rule-making organization.
  • A working draft is the rulebook being edited before the next season.
  • A proposal is a suggested rule change sent to the organizers.
  • A reference site is a helpful fan-made guide to the rules.

A guide can be easier to read, but when a precise ruling matters, the final rulebook is the authority.

Take Quiz

Syntax and Examples

There is no programming syntax to learn here; the useful skill is recognizing standard identifiers and citing them accurately.

A common citation format is:

ISO/IEC 9899:2011, section 6.5.6

This means:

  • ISO/IEC is the publishing standards organization.
  • 9899 identifies the C standard family.
  • 2011 identifies the edition, commonly called C11.
  • 6.5.6 is a section within that edition.

For C++, the family number is different:

ISO/IEC 14882:2017, section [stmt.if]

This refers to C++17. C++ documents often use named section labels such as [stmt.if], while C documents commonly use numbered clauses such as 6.8.4.1.

Useful identifiers for the editions in the question are:

Common namePublished document identifier
C89 / ANSI CANSI X3.159-1989
C90ISO/IEC 9899:1990
C99ISO/IEC 9899:1999
C11ISO/IEC 9899:2011
C++98ISO/IEC 14882:1998
C++03ISO/IEC 14882:2003
C++11ISO/IEC 14882:2011
C++14ISO/IEC 14882:2014
C++17ISO/IEC 14882:2017

C89 and C90 are closely related names for the first standardized C language. C89 typically refers to the ANSI publication; C90 refers to the corresponding ISO publication.

Step by Step Execution

Suppose you see this statement in a C++ discussion:

C++17 [dcl.init] says that ...

Use this process to verify it:

  1. Identify the requested language and edition: C++17.
  2. Convert the edition to its document identifier: ISO/IEC 14882:2017.
  3. Notice that [dcl.init] is a C++ named clause label, related to initialization declarations.
  4. Open an authoritative copy of the published document, if you have access, or a C++17-era committee draft for research.
  5. Search for the clause label, then read the surrounding paragraphs, notes, and examples.
  6. Check the document’s version. A current C++ draft can contain later changes, so it must not be cited as proof of C++17 behavior.

For example, this program can have different validity or behavior depending on the selected language mode:

#include <optional>

int main() {
    std::optional<int> value = 42;
}

std::optional was added in C++17. When researching it, make sure the compiler is configured for C++17 or newer and make sure your source describes the C++17 library, not merely “C++” in general.

Real World Use Cases

Developers consult standard documents when they need an answer more precise than a tutorial can provide.

  • Compiler portability: Determine whether an expression is guaranteed to work on every conforming implementation.
  • Undefined behavior investigations: Check whether an operation is defined, unspecified, implementation-defined, or undefined.
  • Library compatibility: Verify when a library type or function, such as std::optional, was introduced.
  • Cross-platform C code: Confirm requirements for headers, integer conversions, storage duration, or the C standard library.
  • Compiler bug reports: Cite the exact rule that a compiler appears to violate.
  • Code reviews: Separate a language guarantee from behavior that happens to work in one compiler.

For ordinary development, a trusted reference may be faster. For edge cases, portability claims, or a bug report, consult the standard or an edition-matched draft.

Take Quiz

Real Codebase Usage

In real codebases, developers rarely read a standard from beginning to end. They use it as a verification tool.

Use the project’s selected language version

Build systems usually specify a language mode:

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

A team using these settings should evaluate language and library features against C11 and C++17, not against the newest draft.

Record assumptions near portability-sensitive code

// Requires C++17: std::optional is part of the standard library in C++17.
#include <optional>

This makes the minimum required standard visible to maintainers.

Cite exact rules in bug reports

A useful issue report includes:

Language mode: C++17
Compiler: Example Compiler 1.2
Expected: behavior required by ISO/IEC 14882:2017, [relevant-clause]
Actual: compiler rejects the program

Use reliable secondary references for navigation

Developers often use cppreference for quick C and C++ library and language lookups, then verify subtle wording against the relevant standard edition or committee draft. This combines speed with accuracy.

Common Mistakes

Treating a draft as the final published standard

A draft may contain changes not present in the edition you are studying.

Incorrect: “The current working draft proves this was valid in C++17.”

Avoid this by checking the draft’s date and its stated target version. Use a C++17 document to support a C++17 claim.

Assuming every PDF online is an authorized official copy

A document found through a search engine may be outdated, incomplete, unofficial, or uploaded without permission. Prefer the ISO catalog, a national standards body, or an official committee site.

Confusing C89 with C90

They refer to closely corresponding early standardizations, but C89 is usually the ANSI designation and C90 is the ISO designation. State which document you mean when precision matters.

Forgetting the standard library version

This code is not just “C++ code”; it requires a suitable C++ library edition:

#include <optional>

std::optional requires C++17 or later. A compiler may accept a newer language mode while a project’s required mode remains older.

Reading only a matching sentence

Standard wording depends on definitions, exceptions, and surrounding paragraphs. Read the containing clause and follow referenced terms.

Treating compiler behavior as proof

If one compiler accepts code, that does not prove the code is required by the standard. It may be an extension or an implementation choice.

Comparisons

ResourceBest useAuthorityTypical availability
Published ISO/IEC standardExact, edition-specific requirementsNormative authorityUsually purchased
ISO catalog entryFinding the official document and editionAuthoritative metadataFree to view
WG14 C committee documentsC drafts, papers, and committee historyOfficial committee material, often non-finalFree
WG21 C++ committee documentsC++ drafts, proposals, and committee historyOfficial committee material, often non-finalFree
cppreferenceFast language and library lookupSecondary referenceFree
Compiler documentationFlags, extensions, implementation behaviorAuthoritative for that compiler onlyUsually free

C committee and C++ committee

LanguageCommitteeCommon document location
CWG14open-std.org/jtc1/sc22/wg14/
C++WG21open-std.org/jtc1/sc22/wg21/

WG14 and WG21 publish meeting papers and drafts. These are excellent research resources, but a document number and date should be checked before treating one as a particular language edition.

Take Quiz

Cheat Sheet

  • C standard family: ISO/IEC 9899
  • C++ standard family: ISO/IEC 14882
  • C11: ISO/IEC 9899:2011
  • C++11: ISO/IEC 14882:2011
  • C++14: ISO/IEC 14882:2014
  • C++17: ISO/IEC 14882:2017
  • C89: usually ANSI X3.159-1989
  • C90: ISO/IEC 9899:1990

Where to look

  • Official published editions: ISO store/catalog or a national standards body.
  • C drafts and papers: WG14 at open-std.org/jtc1/sc22/wg14/.
  • C++ drafts and papers: WG21 at open-std.org/jtc1/sc22/wg21/.
  • Convenient current C++ draft rendering: eel.is/c++draft.
  • Fast secondary lookup: cppreference.

Rules for accurate research

  1. Match the document to the claimed language edition.
  2. Check whether the source is a published standard, draft, or proposal.
  3. Read surrounding wording and referenced definitions.
  4. Do not infer a standard guarantee solely from one compiler’s behavior.
  5. Cite the edition and clause when the detail matters.

FAQ

Are C and C++ standards free to download?

The final published ISO/IEC standards are generally sold by ISO or national standards bodies. Committee drafts and papers are commonly available free of charge from WG14 and WG21.

Where can I find the official current C++ draft online?

WG21 publishes committee documents at open-std.org/jtc1/sc22/wg21/. The current working draft is also conveniently rendered at eel.is/c++draft. It is a draft, not a replacement for a published edition.

Where can I find C standard drafts online?

WG14 publishes documents, including working drafts and proposals, at open-std.org/jtc1/sc22/wg14/. Check each document’s number, date, and status.

Is cppreference the C++ standard?

No. cppreference is a widely used secondary reference. It is useful for learning and quick lookups, but it is not the ISO/IEC standard and may summarize rather than reproduce normative wording.

What is the difference between C89 and C90?

C89 normally means the ANSI C standard, ANSI X3.159-1989. C90 normally means the corresponding ISO standard, ISO/IEC 9899:1990. They are closely related, but their publication organizations and identifiers differ.

How do I know which C++ version my project uses?

Check its compiler command line or build configuration. For example, GCC and Clang commonly use flags such as -std=c++17, while build systems may set a C++ standard property.

Can I cite a newer standard to explain old code?

You can use it for background, but not as proof of what an older edition required. Rules can change between editions; cite the edition that the code targets.

What are the latest published C and C++ editions?

At the time of writing, C23 is published as ISO/IEC 9899:2024 and C++23 is published as ISO/IEC 14882:2024. Always verify the ISO catalog for the latest publication status.

Take Quiz

Mini Project

Description

Create a small C++ program that reports the language standard selected by the compiler. This is useful when diagnosing why a project can or cannot use a feature from a particular C++ edition.

Goal

Compile the program in different language modes and identify the selected C++ standard from the __cplusplus macro.

Requirements

  • Create a C++ source file that reads the __cplusplus macro.
  • Print a readable name for C++11, C++14, C++17, C++20, and C++23-or-newer modes.
  • Print the macro’s numeric value for unknown or older modes.
  • Compile the program with at least two different -std= options.
  • Compare the output with the language version configured for your project.
Take Quiz

Keep learning

Related questions

View more