C99 (previously C9X, formally ISO/IEC 9899:1999) is a past version of the
C programming language
open standard
An open standard is a standard that is openly accessible and usable by anyone. It is also a common prerequisite that open standards use an open license that provides for extensibility. Typically, anybody can participate in their development due to ...
. It extends the previous version (
C90) with new features for the language and the
standard library
In computer programming, a standard library is the library (computing), library made available across Programming language implementation, implementations of a programming language. Often, a standard library is specified by its associated program ...
, and helps implementations make better use of available computer hardware, such as
IEEE 754-1985
IEEE 754-1985 is a historic industry standard for representing floating-point numbers in computers, officially adopted in 1985 and superseded in 2008 by IEEE 754-2008, and then again in 2019 by minor revision IEEE 754-2019. During its 23 years, ...
floating-point arithmetic
In computing, floating-point arithmetic (FP) is arithmetic on subsets of real numbers formed by a ''significand'' (a Sign (mathematics), signed sequence of a fixed number of digits in some Radix, base) multiplied by an integer power of that ba ...
, and compiler technology.
The
C11 version of the C programming language standard, published in 2011, updates C99.
History
After
ANSI
The American National Standards Institute (ANSI ) is a private nonprofit organization that oversees the development of voluntary consensus standards for products, services, processes, systems, and personnel in the United States. The organiz ...
produced the official standard for the C programming language in 1989, which became an international standard in 1990, the C language specification remained relatively static for some time, while
C++ continued to evolve, largely during its own standardization effort. Normative Amendment 1 created a new standard for C in 1995, but only to correct some details of the 1989 standard and to add more extensive support for international character sets. The standard underwent further revision in the late 1990s, leading to the publication of ISO/IEC 9899:1999 in 1999, which was adopted as an ANSI standard in May 2000. The language defined by that version of the standard is commonly referred to as "C99". The international C standard is maintained by the
working group
A working group is a group of experts working together to achieve specified goals. Such groups are domain-specific and focus on discussion or activity around a specific subject area. The term can sometimes refer to an interdisciplinary collab ...
ISO/IEC JTC1/SC22/WG14.
Design

C99 is, for the most part, backward compatible with C89, but it is stricter in some ways.
In particular, a declaration that lacks a type specifier no longer has
int
implicitly assumed. The C standards committee decided that it was of more value for compilers to diagnose inadvertent omission of the type specifier than to silently process legacy code that relied on implicit
int
. In practice, compilers are likely to display a warning, then assume
int
and continue translating the program.
C99 introduced several new features, many of which had already been implemented as extensions in several compilers:
*
inline function
In the C (programming language), C and C++ programming languages, an inline function is one qualified with the Keyword (computer programming), keyword inline; this serves two purposes:
# It serves as a compiler directive that suggests (but doe ...
s
* intermingled declarations and code:
variable declaration is no longer restricted to file scope or the start of a compound statement (block)
* several new
data type
In computer science and computer programming, a data type (or simply type) is a collection or grouping of data values, usually specified by a set of possible values, a set of allowed operations on these values, and/or a representation of these ...
s, including
long long int
, optional extended integer types, an explicit
Boolean data type
In computer science, the Boolean (sometimes shortened to Bool) is a data type that has one of two possible values (usually denoted ''true'' and ''false'') which is intended to represent the two truth values of logic and Boolean algebra. It is na ...
, and a
complex
type to represent
complex number
In mathematics, a complex number is an element of a number system that extends the real numbers with a specific element denoted , called the imaginary unit and satisfying the equation i^= -1; every complex number can be expressed in the for ...
s
*
variable-length array
In computer programming, a variable-length array (VLA), also called variable-sized or runtime-sized, is an array data structure whose length is determined at runtime, instead of at compile time. In the language C, the VLA is said to have a variab ...
s (although subsequently relegated in
C11 to a conditional feature that implementations are not required to support)
*
flexible array member
C struct data types may end with a flexible array member with no specified size:
struct vectord ;
Typically, such structures serve as the header in a larger, variable memory allocation:
struct vectord *vector = malloc(...);
vector->len ...
s
* support for one-line
comments beginning with
//
, as in
BCPL
BCPL ("Basic Combined Programming Language") is a procedural, imperative, and structured programming language. Originally intended for writing compilers for other languages, BCPL is no longer in common use. However, its influence is still f ...
,
C++ and
Java
Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
* new library functions, such as
snprintf
* new
headers, such as
< stdbool.h>
,
< complex.h>
,
< tgmath.h>
, and
< inttypes.h>
* type-generic math (macro) functions, in
, which select a
math library function based upon
float
,
double
, or
long double
arguments, etc.
* improved support for
IEEE floating point
The IEEE Standard for Floating-Point Arithmetic (IEEE 754) is a technical standard for floating-point arithmetic originally established in 1985 by the Institute of Electrical and Electronics Engineers (IEEE). The standard addressed many probl ...
* designated initializers. For example, initializing a structure by field names:
struct point p = ;
* compound literals. For instance, it is possible to construct structures in function calls:
function((struct x) )
* support for
variadic macro
A variadic macro is a feature of some computer programming languages, especially the C preprocessor, whereby a macro may be declared to accept a varying number of arguments.
Variable-argument macros were introduced in 1999 in the ''ISO/IEC 9899 ...
s (macros with a variable number of arguments)
*
restrict
In the C programming language, restrict is a keyword, introduced by the C99 standard, that can be used in pointer declarations. By adding this type qualifier, a programmer hints to the compiler that for the lifetime of the pointer, no other ...
qualification allows more aggressive code
optimization
Mathematical optimization (alternatively spelled ''optimisation'') or mathematical programming is the selection of a best element, with regard to some criteria, from some set of available alternatives. It is generally divided into two subfiel ...
, removing compile-time array access advantages previously held by
FORTRAN over ANSI C
* universal character names, which allows user variables to contain other characters than the standard character set: four-digit or eight-digit hexadecimal sequences
* keyword
static
in array indices in parameter declarations
Parts of the C99 standard are included in the current version of the
C++ standard, including integer types, headers, and library functions. Variable-length arrays are not among these included parts because C++'s
Standard Template Library
The Standard Template Library (STL) is a software library originally designed by Alexander Stepanov for the C++ programming language that influenced many parts of the C++ Standard Library. It provides four components called ''algorithms'', '' ...
already includes similar functionality.
IEEE 754 floating-point support
A major feature of C99 is its numerics support, and in particular its support for access to the features of
IEEE 754-1985 (also known as IEC 60559)
floating-point
In computing, floating-point arithmetic (FP) is arithmetic on subsets of real numbers formed by a ''significand'' (a Sign (mathematics), signed sequence of a fixed number of digits in some Radix, base) multiplied by an integer power of that ba ...
hardware present in the vast majority of modern processors (defined in "Annex F IEC 60559 floating-point arithmetic"). Platforms without IEEE 754 hardware can also implement it in software.
On platforms with IEEE 754 floating point:
FLT_EVAL_METHOD 2
tends to limit the risk of
rounding errors
In computing, a roundoff error, also called rounding error, is the difference between the result produced by a given algorithm using exact arithmetic and the result produced by the same algorithm using finite-precision, rounded arithmetic. Ro ...
affecting numerically unstable expressions (see
IEEE 754 design rationale) and is the designed default method for
x87 hardware, but yields unintuitive behavior for the unwary user;
FLT_EVAL_METHOD 1
was the default evaluation method originally used in
K&R C, which promoted all floats to double in expressions; and
FLT_EVAL_METHOD 0
is also commonly used and specifies a strict "evaluate to type" of the operands. (For
gcc,
FLT_EVAL_METHOD 2
is the default on 32 bit x86, and
FLT_EVAL_METHOD 0
is the default on 64 bit x86-64, but
FLT_EVAL_METHOD 2
can be specified on x86-64 with option -mfpmath=387.) Before C99, compilers could round intermediate results inconsistently, especially when using
x87 floating-point hardware, leading to compiler-specific behaviour;
such inconsistencies are not permitted in compilers conforming to C99 (annex F).
Example
The following annotated example C99 code for computing a continued fraction function demonstrates the main features:
#include
#include
#include
#include
#include
#include
#include
double compute_fn(double z) //
int main(void)
Footnotes:
# Compile with:
# As the IEEE 754 status flags are manipulated in this function, this #pragma is needed to avoid the compiler incorrectly rearranging such tests when optimising. (Pragmas are usually implementation-defined, but those prefixed with
STDC
are defined in the C standard.)
# C99 defines a limited number of expression evaluation methods: the current compilation mode can be checked to ensure it meets the assumptions the code was written under.
# The special values such as
NaN and positive or negative infinity can be tested and set.
#
long double
is defined as IEEE 754 double extended or quad precision if available. Using higher precision than required for intermediate computations can minimize
round-off error
In computing, a roundoff error, also called rounding error, is the difference between the result produced by a given algorithm using exact arithmetic and the result produced by the same algorithm using finite-precision, rounded arithmetic. Roun ...
(the
typedef
typedef is a reserved keyword in the programming languages C, C++, and Objective-C. It is used to create an additional name (''alias'') for another data type, but does not create a new type, except in the obscure case of a qualified typedef of ...
double_t
can be used for code that is portable under all
FLT_EVAL_METHOD
s).
# The main function to be evaluated. Although it appears that some arguments to this continued fraction, e.g., 3.0, would lead to a divide-by-zero error, in fact the function is well-defined at 3.0 and division by 0 will simply return a +infinity that will then correctly lead to a finite result: IEEE 754 is defined not to trap on such exceptions by default and is designed so that they can very often be ignored, as in this case. (If
FLT_EVAL_METHOD
is defined as 2 then all internal computations including constants will be performed in long double precision; if
FLT_EVAL_METHOD
is defined as 0 then additional care is need to ensure this, including possibly additional casts and explicit specification of constants as long double.)
# As the raised divide-by-zero flag is not an error in this case, it can simply be dismissed to clear the flag for use by later code.
# In some cases, other exceptions may be regarded as an error, such as overflow (although it can in fact be shown that this cannot occur in this case).
#
__STDC_IEC_559__
is to be defined only if "Annex F IEC 60559 floating-point arithmetic" is fully implemented by the compiler and the C library (users should be aware that this macro is sometimes defined while it should not be).
# The default rounding mode is round to nearest (with the even rounding rule in the halfway cases) for IEEE 754, but explicitly setting the rounding mode toward + and - infinity (by defining
TEST_NUMERIC_STABILITY_UP
etc. in this example, when debugging) can be used to diagnose numerical instability. This method can be used even if
compute_fn()
is part of a separately compiled binary library. But depending on the function, numerical instabilities cannot always be detected.
Version detection
A standard macro
__STDC_VERSION__
is defined with value
199901L
to indicate that C99 support is available. As with the
__STDC__
macro for C90,
__STDC_VERSION__
can be used to write code that will compile differently for C90 and C99 compilers, as in this example that ensures that
inline
is available in either case (by replacing it with
static
in C90 to avoid linker errors).
#if __STDC_VERSION__ >= 199901L
/* "inline" is a keyword */
#else
# define inline static
#endif
Implementations
Most C compilers provide support for at least some of the features introduced in C99.
Historically,
Microsoft
Microsoft Corporation is an American multinational corporation and technology company, technology conglomerate headquartered in Redmond, Washington. Founded in 1975, the company became influential in the History of personal computers#The ear ...
has been slow to implement new C features in their
Visual C++
Microsoft Visual C++ (MSVC) is a compiler for the C, C++, C++/CLI and C++/CX programming languages by Microsoft. MSVC is proprietary software; it was originally a standalone product but later became a part of Visual Studio and made available ...
tools, instead focusing mainly on supporting developments in the C++ standards. However, with the introduction of Visual C++ 2013 Microsoft implemented a limited subset of C99, which was expanded in Visual C++ 2015.
Future work
Since ratification of the 1999 C standard, the standards working group prepared technical reports specifying improved support for embedded processing, additional character data types (Unicode support), and library functions with improved bounds checking. Work continues on technical reports addressing decimal floating point, additional mathematical special functions, and additional
dynamic memory allocation
Memory management (also dynamic memory management, dynamic storage allocation, or dynamic memory allocation) is a form of resource management applied to computer memory. The essential requirement of memory management is to provide ways to dyna ...
functions. The C and C++ standards committees have been collaborating on specifications for
threaded programming.
The next revision of the C standard,
C11, was ratified in 2011.
The C standards committee adopted guidelines that limited the adoption of new features that have not been tested by existing implementations. Much effort went into developing a
memory model, in order to clarify
sequence point
In C and C++, a sequence point defines any point in a computer program's execution at which it is guaranteed that all side effects of previous evaluations will have been performed, and no side effects from subsequent evaluations have yet been per ...
s and to support
threaded programming.
See also
*
C++23
C++23, formally ISO/IEC 14882:2024, is the current open standard for the C++ programming language that follows C++20. The final draft of this version is N4950.
In February 2020, at the final meeting for C++20 in Prague, an overall plan for C++ ...
,
C++20 C20 or C-20 may refer to:
Science and technology
* Carbon-20 (C-20 or 20C), an isotope of carbon
* C20, the smallest possible fullerene (a carbon molecule)
* C20 (engineering), a mix of concrete that has a compressive strength of 20 newtons per squ ...
,
C++17
C17, C-17 or C.17 may refer to:
Transportation
* , a 1917 British C-class submarine
Air
* Boeing C-17 Globemaster III, a military transport aircraft
* Lockheed Y1C-17 Vega, a six-passenger monoplane
* Cierva C.17, a 1928 English experimental ...
,
C++14
C14, C.XIV or C-14 may refer to:
Time
* The 14th century
* Carbon-14, a radioactive isotope of carbon
** Radiocarbon dating, C-14 dating, a method for dating events
Science
* IEC 60320#C14, IEC 60320 C14, a polarised, three pole socket electrical ...
,
C++11
C++11 is a version of a joint technical standard, ISO/IEC 14882, by the International Organization for Standardization (ISO) and International Electrotechnical Commission (IEC), for the C++ programming language. C++11 replaced the prior vers ...
,
C++03
C++03 is a version of the ISO/ IEC 14882 standard for the C++ programming language. It is defined by two standards organizations, the International Organization for Standardization (ISO) and the International Electrotechnical Commission (IEC), in ...
,
C++98, versions of the C++ programming language standard
*
Compatibility of C and C++
*
C++ Technical Report 1
*
Floating point
In computing, floating-point arithmetic (FP) is arithmetic on subsets of real numbers formed by a ''significand'' (a signed sequence of a fixed number of digits in some base) multiplied by an integer power of that base.
Numbers of this form ...
, for further discussion of usage of IEEE 754 hardware
References
Further reading
N1256(final draft of C99 standard plus TC1, TC2, TC3); WG14; 2007.
HTML and ASCII versions
(official C99 standard);
ISO
The International Organization for Standardization (ISO ; ; ) is an independent, non-governmental, international standard development organization composed of representatives from the national standards organizations of member countries.
Me ...
; 1999.
Rationale for C99 WG14; 2003.
*
*
External links
- WG14
Features of C99
{{ISO standards
C (programming language)
Programming language standards
Unix programming tools
IEC standards
ISO standards
bg:C (език за програмиране)#C99