|
9.1.3 C++ Compilers
In order for a C++ program to use a library compiled with a C compiler,
it is necessary for any symbols exported from the C library to be
declared between `extern "C" {' and `}'. This code is
important, because a C++ compiler mangles(7) all variable and function names, where
as a C compiler does not. On the other hand, a C compiler will not
understand these lines, so you must be careful to make them invisible
to the C compiler.
Sometimes you will see this method used, written out in long hand in
every installed header file, like this:
| #ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif
|
But that is a lot of unnecessary typing if you have a few dozen headers
in your project. Also the additional braces tend to confuse text
editors, such as emacs, which do automatic source indentation based on
brace characters.
Far better, then, to declare them as macros in a common header file, and
use the macros in your headers:
| #ifdef __cplusplus
# define BEGIN_C_DECLS extern "C" {
# define END_C_DECLS }
#else /* !__cplusplus */
# define BEGIN_C_DECLS
# define END_C_DECLS
#endif /* __cplusplus */
|
I have seen several projects that name such macros with a leading
underscore -- `_BEGIN_C_DECLS'. Any symbol with a leading
underscore is reserved for use by the compiler implementation, so you
shouldn't name any symbols of your own in this way. By way of
example, I recently ported the
Small(8) language
compiler to Unix, and almost all of the work was writing a Perl script
to rename huge numbers of symbols in the compiler's reserved namespace
to something more sensible so that GCC could even parse the
sources. Small was originally developed on Windows, and the author had
used a lot of symbols with a leading underscore. Although his symbol
names didn't clash with his own compiler, in some cases they were the
same as symbols used by GCC.
|