C and C++ preserve case sensitivity in their symbol tables while Fortran by default does not, a difference that requires attention. Fortunately, you can use the Fortran directive ATTRIBUTES ALIAS option to resolve discrepancies between names, to preserve mixed-case names, or to override the automatic conversion of names to all lowercase by Fortran.
C++ uses the same calling convention and argument-passing techniques
as C, but naming conventions differ because of C++ decoration of external
symbols. When the C++ code resides in a .cpp
file (created when you select C/C++ file
from the integrated development environment), C++ name decoration semantics
are applied to external names, often resulting in linker errors. The extern
"C" syntax makes it possible for a C++ module to share data
and routines with other languages by causing C++ to drop name decoration.
The following example declares prn as an external function using the C naming convention. This declaration appears in C++ source code:
extern
"C" { void prn(); }
To call functions written in Fortran, declare the function as you would in C and use a "C" linkage specification. For example, to call the Fortran function FACT from C++, declare it as follows:
extern
"C" { int fact( int* n ); }
Note that, by default, names are lowercase and numbers are passed by reference.
The extern "C" syntax can be used to adjust a call from C++ to other languages, or to change the naming convention of C++ routines called from other languages. However, extern "C" can only be used from within C++. If the C++ code does not use extern "C" and cannot be changed, you can call C++ routines only by determining the name decoration and generating it from the other language. Such an approach should only be used as a last resort, because the decoration scheme is not guaranteed to remain the same between versions.
Use of extern "C" has some restrictions:
You cannot declare a member function with extern "C."
You can specify extern "C" for only one instance of an overloaded function; all other instances of an overloaded function have C++ linkage.