The C programming language has evolved over many years, and each major update is identified by a version number usually referring to the year the standard was published. The most well-known ones are C89, C99, C11, and C2x.

Below is a simple breakdown of all major versions:

K&R C (1978)

The original version of C, created by Dennis Ritchie (designer and implementer of the language) and Brian Kernighan (author of the reference book). Today, pure K&R C style is rarely seen; it looks “old” to most modern C programmers—similar to how Middle English feels to modern English readers.

C89 / ANSI C / C90

In 1989, ANSI released a standardized version of C.

In 1990, ISO published a nearly identical standard known as C90. This version defined the foundation for all future C standards.

C95

A lesser-known update that added wide-character support to C89.

C99

The first major revision of the language. Introduced many new features and improvements. Still widely used today.

C11

A big update that added:

Unicode support

Multithreading features

However, using C11-specific features may reduce compatibility with systems still stuck on C99.

C17 / C18

These are essentially bug-fix updates to C11. Although the release happened in 2018, the official name is C17. Both versions are interchangeable, but C17 is the preferred name.

C2x

The future of C! “2x” means the exact year is still unknown — but it’s the next upcoming standard.

Using Standards in GCC

You can choose which C standard to use with GCC using the -std= flag. For strict standard compliance, add -pedantic.

Examples:

gcc -std=c11 -pedantic foo.c gcc -Wall -Wextra -std=c2x -pedantic foo.c