How & why to use extern “C” to disable name mangling in C++

When mixing C and C++ (i.e., a. calling C function from C++; and b. calling C++ function from C), the C++ name mangling causes linking problems. Technically speaking, this issue happens only when the callee functions have been already compiled into binary (most likely, a *.a library file) using the corresponding compiler.

For a better understanding the issue, we start from:

Call C functions from C++

Problem

pure.c:

pure.h:

taint.cpp:

To establish a mixed compiling environment, we compile the object files one by one:

Then we link:

output:

Solution

We define the C function as extern "C" to make it callable from a C++ program.

pure.h(modified):

Then we run the above compile/link commands:

output:

Why

We examine the binary to better understand why:

Firstly we look at pure.o:

output:

Secondly, we look at taint.o using the problematic version pure.h:

output:

As given in the outputs, the actual function names of print do not match from the caller (in C++, __Z5printv ) and the callee(in C, _print ).

If we look at the taint.o using the modified version of pure.h:

This is how the problem is solved.

Call C++ functions from C

This time, I will skip problem and principle but give the solution only.

callee.cpp:

callee.h:

caller.c:

compile & run:

output:

Best practice

name mangling in a word

C++ introduces name mangling to support something that does not exist in C, namely, function overloading, member function etc.

So when calling C++ functions from C, if the functions fall into the categories above, wrapper functions defined as extern "C" should be used.

Self-defined C library

To enable your C library to be used directly by C++ projects, surround the function declaring code with:

We use #ifdef __cplusplus as extern "C" notation can be used only in C++.

3rd party C library

Most likely, nothing is required as the above technique has been applied already. If now, include the header files this way:

So all the functions can be declared as extern "C".

 

 

Author: Holmes He

Holmes is a cameo frontend developer