What is the purpose of using extern “C” in C++ code?
The extern "C"
syntax in C++ is used to declare functions or variables with C linkage. This means that the compiler will not “mangle” the names of these entities, making them compatible with C code.
In C++, function names are often “mangled” to include additional information about the arguments and return types, which allows for function overloading. However, C does not support function overloading, so it does not require name mangling.
By using extern "C"
, you can ensure that your function or variable can be used by C code without any name mangling issues. You can apply extern "C"
to individual declarations or definitions, or group them together in a block.
It’s important to note that extern "C"
only affects the linkage of the function or variable, not its behavior or implementation. The specifics of how linkage works are defined in the C++ standard, particularly in section 7.5 of the C++03 standard.
When calling a C interface from a C++ program, it’s necessary to ensure that the C++ compiler does not use name mangling, which is a process that alters function names to include additional information about arguments and return types. Since C does not use name mangling, you need to declare the C interface using extern "C"
in C++ to ensure that the function names are compatible and can be linked correctly.
In C++, functions can have the same name within a class through overloading. However, since these functions are essentially different due to their parameters, they cannot be exported directly from a DLL or shared library. To distinguish these functions, C++ compilers use name mangling, which involves converting function names and their parameters into unique strings called symbols. This allows each function, even those with the same name, to be identified uniquely.
In contrast, C does not support function overloading, so each function name is already unique. As a result, C does not require name mangling.
To prevent name mangling in C++, you can use extern "C"
before the function declaration. This is often used when exporting functions from a DLL with a specific name, ensuring that they can be used by the DLL’s clients without name mangling issues.