Are You Ready For C99?
by
Dare Obasanjo
ANSI and the ISO ratified the newest draft of the C standard in
1999 and unleashed the biggest changes to the language to date. New
keywords, library functions, and macros are just the tip of the
iceberg when it comes to the new improved C. In fact, the language
is so different it is no longer compatible with C++. This article
attempts to give an overview of the major changes made to the C
language and also attempts to discover why no one yet seems to be
affected by the new standard.
Interesting New Features
A list of features that should[0] have made it into the C99
standard is available on Thomas
Wolf's webpage. Listed below are the changes that most
developers would notice or care about at first use.
- Increased identifier size limits: specifically 63
significant initial characters in an internal identifier or macro
name, 31 significant initial characters in an external
identifier, and 4095 characters in a logical source line. These
values were 31, 6, and 509, respectively, in C89.
The small identifier size is the reason so many ANSI functions
had terse names (strcpy, strstr, strchr, etc) since the standard
only guaranteed that the first six characters would be used to
uniquely identify the functions.
- C++ style/line comments: The characters '//'
can now be used to delineate a line of commented text, just like
in C++.
- Macros take variable arguments denoted by elipsees:
Function-like macros will accept variable arguments denoted by
using the ellipsis (...) notation. For replacement, the variable
arguments (including the separating commas) are
"collected" into one single extra argument that can be
referenced as __VA_ARGS__ within the macro's replacement
list.
- Inline functions: The C language now supports the
inline keyword which allows functions to be defined as inline,
which is a hint to the compiler that invocations of such
functions can be replaced with inline code expansions rather than
actual function calls.
- Restricted pointers: The C language now supports the
restrict keyword which allows pointers to be defined as
restricted, which is a hint to the compiler to disallow two
restricted pointers from being aliases to the same object which
allows for certain optimizations when dealing with the said
pointers.
-
_Bool Macro: There is a _Bool type which is a actually
two valued integer type. True is defined as
#define true (_Bool)1
while false is defined as
#define false (_Bool)0
- Variable Declarations can appear anywhere in the code
block: No longer do variables have to be defined at the top
of the code block.
- Variable length arrays: These are arrays whose size is
determined at runtime.
- Variable declarations in for loops: Variables can now
be declared and initialized in for loops just like in C++ and
Java.
-
Named initialization of structs: The members of a struct
can now be initialized by name such as is done in the code
block below
struct {float x, y, z;} s = { .y = 1.0, .x = 3.5, .z = 12.8};
- New long long type: There is a new type called long
long which is at least 64 bits and can be both signed or
unsigned. The new suffixes "LL" or "ll" (and
"ULL" or "ull") are used for constants of the
new long long type.
- Functions must declare a return value: Function return
types no longer defaults to int if the function declares no
return type.
- Last member of a struct may be an incomplete array
type. : This is to support the "struct hack" which
works on most existing C compilers already. A
code example of the struct hack is shown on Thomas's
site.
- Addition of _Complex and _Imaginary number types: A
boon for programmers doing any sort of advanced math in their
programs.
-
Multiple uses of a type qualifier are ignored after the
first occurence: If a type qualifier appears several times
(either directly or indirectly through typedefs) in a type
specification, it's treated as if it appeared only once.
E.g.
const const int x;
is the same as
const int x;
C++ Incompatibilities
The aforementioned features are rather impressive but one soon
realizes that this means that C is no longer a subset of C++. There
is a list
of the major incompatibilities between the current ISO standards
for C and C++ on David
Tribble's webpage. At this point it is still too early to
see if either C or C++ will be harmed by this development but it is
clear that there will be some growing pains once C99 adoption
becomes widespread.
Bjarne Stroustrup mentioned in a
recent interview with LinuxWorld that he would have liked for
both languages to be compatible and would favor a technical
committee whose express purpose would be integrating both
languages, but doubts the possibility of this coming to pass.
Stroustrup also contrasted how C's technical commitee decided
to implement most of the added functionality via changes to the
actual C language against the C++ approach which was by adding
additional libraries.
Compiler support
After describing all the exciting new features of C99, one would
expect there to be more awareness of the standard by now but there
isn't. The primary reason for the lack of awareness of C99 is
the fact that compiler support at the current time is practically
non-existent. Here is the status of the major compiler vendors for
the development platforms that I'm interested in:
- Microsoft: A
search on Microsoft's site for C99 draws a total blank.
It looks like Microsoft does not plan to upgrade the C compiler
that ships with Visual C++ to cover the C99 standard.
- Borland: A
search on Borland's site for C99 also draws a blank.
Again it looks like exclusive C++ development has won over
keeping their C compiler up to date.
- Comeau Computing: The most recent version of their compiler
(version 4.2.45.1) which is available for
online testing claims to support a large number of features
from C99. The compiler has not yet been released but can be
tested online by submitting code snippets in an HTML form.
- SAS Institute: SAS/C version
7.0 supports the "long long" type, inline functions
and a few of the preprocessor directives.
- Edison Design Group: The EDG C++ front end
supposedly supports both C89 and C99 as well as Microsoft C++ and
ANSI/ISO C++.
- GNU: GCC has a
status page of C99 compliance which shows that they are quite
close to becoming fully compliant with the C99 standard.
Where To Get It
If you are interested in being the first kid on your block who
knows the finer points of restricted pointers and variable
argument macros, you can
purchase the C99 standard online from ANSI. Finally no
discussion of C99 is complete without a reference to
Dennis Ritchie's opinion of the C99 standard.
[0] I didn't buy a copy of the standard, so I cannot guarantee
that everything on that site made it into the standard although
there is a good chance that everything did.
© 2001 Dare Obasanjo