Autoconf, Automake, and Libtool: C++ Compilers

| ### 9.1.3 C++ Compilers In order for a C++ program to use a library compiled with a C compiler, it is neccessary 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.

This document was generated by Gary V. Vaughan on May, 24 2001 using texi2html