8.2 C Library Wrappers
The C++ library includes the entire C standard
library (from the 1990 C standard, plus Amendment 1), in which each C
header, such as <stdio.h>, is wrapped as a
C++ header (e.g., <cstdio>). Being part of
the C++ standard, all types, functions, and objects are declared in
the std namespace.
The external names are also reserved in the global namespace. Thus,
proper practice is to use the names in the std
namespace (e.g., std::strlen), but realize that
these names are also reserved in the global namespace, so you cannot
write your own ::strlen function.
The C standard permits macros to be defined to mask function names.
In the C++ wrappers for these headers, the names must be declared as
functions, not macros. Thus, the C <stdio.h>
header might contain the following:
extern int printf(const char* fmt, ...);
#define printf printf
In C++, the printf macro is not permitted, so the
<cstdio> header must declare the
printf function in the std
namespace, so you can use it as std::printf.
A deprecated feature of C++ is that the C
standard headers are also available as their original C names (e.g.,
<stdio.h>). When used in this fashion, their
names are in the global namespace, as though a
using declaration were applied to each name (e.g.,
using std::printf). Otherwise,
the old style headers are equivalent to the new headers. The old C
header names are deprecated; new code should use the
<cstdio>, etc., style C headers.
|