Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
In this article
Name decoration usually refers to C++ naming conventions, but can apply to a number of C cases as well. By default, C++ uses the function name, parameters, and return type to create a linker name for the function. Consider the following function declaration:
void CALLTYPE test(void);
The following table shows the linker name for various calling conventions.
Calling convention | extern "C" or .c file |
.cpp , .cxx or /TP |
---|---|---|
C naming convention (__cdecl ) |
_test |
?test@@ZAXXZ |
Fast call naming convention (__fastcall ) |
@test@0 |
?test@@YIXXZ |
Standard call naming convention (__stdcall ) |
_test@0 |
?test@@YGXXZ |
Vector call naming convention (__vectorcall ) |
test@@0 |
?test@@YQXXZ |
Use extern "C"
to call a C function from C++. extern "C"
forces use of the C naming convention for non-class C++ functions. Be aware of compiler switches /Tc or /Tp, which tell the compiler to ignore the filename extension and compile the file as C or C++, respectively. These options may cause linker names you don't expect.
Having function prototypes that have mismatched parameters can also cause this error. Name decoration incorporates the parameters of a function into the final decorated function name. Calling a function with the parameter types that don't match those in the function declaration may also cause LNK2001.
There are currently no standards for C++ naming between compiler vendors or even between different versions of a compiler. Linking object files compiled by other compilers may not produce the same naming scheme, and can cause unresolved externals.