C functions or symbols are links as the name with under score prefixed with. If the function name is main() the linking symbol name will be _main(). Also if a variable name is int count; The linking symbol name will be _count.
For C++ compiler this is not true. C++ has function overloading mechanism. If C++ uses only under score before function name to link its symbol the purpose of overloading will not be resolved.
Take an example
Suppose in C++ we have add() function overloaded as
int add(int a, int b)
- adds a and b, two arguments
int add(int a, int b, int c)
- adds a, b and c, three arguments
Now if C++ uses _add() as symbol name then the two function body can never be linked.
To overcome this limitation of C, C++ linker uses name mangling. It modifies the name of the function like as <function index><function name>@<argument size>
Example will be
int add(int a, int b) links to _1add@8
[function index 1, function name = add, argument size= sizeof(int)*2 = 8]
int add(int a, int b, int c) links to _2add@12
[function index 2, function name = add, argument size= sizeof(int)*3 = 12]
Extern "C" key word does the reverse it maintains the linking style of C while linking with C++ compiler.
Thus even if we compile a function of a C++ file with C++ compiler, it links as C convention thus overloading of this function is not possible.
Example extern "C" int add(int a, int b);
Thus most of the C header files when compiles in C++ code/compiler are enclosed as
#ifdef __cplusplus extern "C" { #endif /*List of C function */ #ifdef __cplusplus } #endif #endif
About our authors: Team EQA
You have viewed 1 page out of 27. Your DLL learning is 0.00% complete. Login to check your learning progress.