(added categories) |
|||
Line 14: | Line 14: | ||
== New headers == | == New headers == | ||
C99 introduced 6 new [[C standard library|standard headers]]: [[tgmath.h - C|<tgmath.h>]], [[stdint.h - C|<stdint.h>]], [[stdbool.h - C|<stdbool.h>]], [[inttypes.h - C|<inttypes.h>]], [[fenv.h - C|<fenv.h>]], and [[complex.h - C|<complex.h>]]. | C99 introduced 6 new [[C standard library|standard headers]]: [[tgmath.h - C|<tgmath.h>]], [[stdint.h - C|<stdint.h>]], [[stdbool.h - C|<stdbool.h>]], [[inttypes.h - C|<inttypes.h>]], [[fenv.h - C|<fenv.h>]], and [[complex.h - C|<complex.h>]]. | ||
+ | |||
+ | == Restricted pointers == | ||
+ | {{main|Restricted pointers - C|l1=Restricted pointers}} | ||
+ | C99 introduced the concept of restricted pointer to the C language through the introduction of the [[restrict - C|restrict]] keyword. Given two pointers, if they do not point to two distinct objects, they are said to be ''aliases''. The ''restrict'' keyword establishes a special association between the pointer and the object it accesses, guaranteeing all accesses to the object it points to occur through that pointer or expressions based on that pointer. | ||
+ | |||
+ | Since multiple pointers can point to the same object, compilers are often unable to make certain optimizations that require them to know that only a specific pointer has access to the object it points to. The restrict keyword was designed to aid such compiler issues. Consequently, various functions such as memcpy(), strcpy(), and strcat() have had their signatures changed to: | ||
+ | |||
+ | <source lang="C"> | ||
+ | void *memcpy(void * restrict s1, const void * restrict s2, size_t n); | ||
+ | char *strcpy(char * restrict s1, const char * restrict s2); | ||
+ | char *strcat(char * restrict s1, const char * restrict s2); | ||
+ | </source> | ||
== Compiler support == | == Compiler support == |
Revision as of 05:24, 23 December 2013
C99 is a past version of the C programming language standard which was ratified by ISO in 1999 and became ISO/IEC 9899:1999. The same standard was later also adopted by ANSI on May 22, 2000. C99 cancels and replaces the first edition, C89, and NA1.
C99 brought the first major updates to the language in a decade. The new standard introduced restricted pointers, variable-length arrays, flexible array members, complex numbers support, type-generic math, long long int
, extended identifiers, hexadecimal floating-point constants, compound literals, designated initializers, single line, //
comments, extended integer type, the ability to mix declarations and code, variadic macros, new math functions, inline functions, boolean types, _Pragma and standard pragmas, and VA_COPY. The standard also removed implicit function declaration.
Version detection
C99 can be detected via the __STDC_VERSION__ mandatory macro which must equal 199901L
.
#if __STDC_VERSION__ >= 199901L
/* C99 support */
#endif
New headers
C99 introduced 6 new standard headers: <tgmath.h>, <stdint.h>, <stdbool.h>, <inttypes.h>, <fenv.h>, and <complex.h>.
Restricted pointers
- Main article: Restricted pointers
C99 introduced the concept of restricted pointer to the C language through the introduction of the restrict keyword. Given two pointers, if they do not point to two distinct objects, they are said to be aliases. The restrict keyword establishes a special association between the pointer and the object it accesses, guaranteeing all accesses to the object it points to occur through that pointer or expressions based on that pointer.
Since multiple pointers can point to the same object, compilers are often unable to make certain optimizations that require them to know that only a specific pointer has access to the object it points to. The restrict keyword was designed to aid such compiler issues. Consequently, various functions such as memcpy(), strcpy(), and strcat() have had their signatures changed to:
void *memcpy(void * restrict s1, const void * restrict s2, size_t n);
char *strcpy(char * restrict s1, const char * restrict s2);
char *strcat(char * restrict s1, const char * restrict s2);
Compiler support
Support for C99 has been a slow ongoing effort.
C99 Compiler Support | |||
Compiler Name | Support Level | Enforcement Switch | Note |
---|---|---|---|
ACK | No Support | ||
Clang | Complete | -std=c99 | No extended identifier support[1] |
GCC | Complete | -std=c99 | Supports everything[2] |
TCC | Partial | Missing lots of features[3] | |
ICC | Partial | -std=c99 | Broken extended identifier support, broken inline function support[4] |
Visual C++ | Partial | Missing type-generic math[5] |